首页 文章 精选 留言 我的

精选列表

搜索[linux],共10000篇文章
优秀的个人博客,低调大师

linux中误删除程序包恢复示例

以CentOS-7.2为例: 删除kernel包,无法重启: 1、删除kernel包, 2、重启,无法启动 3、再次重启,出现进度条时按下Esc键,出现如下界面,选择从光盘启动 4、进入如下界面,选择Troubleshooting 5、选择救援模式,Rescue a CentOS system 6、键入回车 7、选择Continue ,键入1,进入 7、回车进入shell 8、查看光盘是否挂载、如若没有挂载,首先挂载光盘 mount/dev/sr0/mnt/cdrom 如下图,光盘已经挂载至/run/instatll/repo 9、安装kernel包,需要注意的是,当前并不是根的位置,如上图,根的位置显示为/mnt/sysp_w_picpath,所以需要指定根的位置,完成后,重新启动即可。 这是以删除kernel包为例,如果误删除rpm包,rpm命令和yum命令不能使用,可以使用以上方法,进行恢复安装。 CentOS6与CentOS7进入救援模式界面有所不同,但修复步骤基本相同,在CentOS6中,选择CD-ROM Drive后选择Resuce installed system,而后会有一些语言,键盘,及网卡等基本选择,之后会出现Resuce选择界面,选择Continue,继续选择直至shell start shell,进入shell,之后操作和7是一样的。

优秀的个人博客,低调大师

Linux C库函数的可重入与不可重入版本说明

在多线程编程中,线程安全(Thread-Safety)是一个非常重要的概念,而可重入性(Reentrancy)是确保线程安全的一个关键因素。 C 标准库中的很多函数都存在可重入(Reentrant)和不可重入版本。在这些函数的命名上,不可重入的函数名称通常是简单的函数名,而可重入版本的函数名称后面通常带有 _r,表示该函数是设计为可重入的版本。 不可重入函数:不可重入的函数通常依赖于共享的全局状态,或使用静态变量来存储中间结果。这使得当多个线程并发调用这些函数时,可能会发生数据竞争或资源争用,导致不安全的行为。 可重入函数:可重入函数在设计上避免了共享状态的问题,它们通常只使用局部变量,或者通过传递上下文指针来存储状态,这样每个线程都拥有自己的副本,避免了竞争条件。 我们在 C 库中经常会遇到一些不可重入的函数,这些函数在多线程环境中可能会出现问题。例如: asctime() 与 asctime_r() ctime() 与 ctime_r() localtime() 与 localtime_r() 这些函数的 _r 版本是可重入的,并且能够在多线程环境下安全使用。 通过 man 手册,我们可以查询每个库函数的详细信息,其中包括其线程安全性标注。例如,执行 man 3 ctime 可以查看 ctime() 和 ctime_r() 函数的详细信息。在这个手册页面的 "ATTRIBUTES" 部分,会显示每个函数是否是线程安全的。 函数的线程安全性 通常会以 MT-Safe 或 MT-Unsafe 标记: MT-Safe(线程安全):表示该函数是多线程安全的,在多线程环境中可以同时被多个线程调用,而不会产生竞态条件或数据竞争。 MT-Unsafe(线程不安全):表示该函数不是线程安全的,如果多个线程同时调用该函数,可能会导致数据不一致或其他不安全行为。 值得注意的是,即使某些函数被标记为 MT-Safe,它们可能还带有一些附加条件(如 env 或 locale 标签)。这些条件表示在某些情况下,即使是可重入版本的函数,也可能会失去线程安全性。这种情况经常出现在依赖环境变量或区域设置(locale)的函数中。 例如,asctime_r()、ctime_r()、localtime_r() 等函数通常被标记为 MT-Safe env locale,这意味着这些函数在满足环境变量和区域设置相关条件时是线程安全的,但如果这些条件不满足(例如环境变量发生变化),它们可能仍然会出现线程不安全的情况。】 在 man 手册的 ATTRIBUTES 部分,经常可以看到 env 和 locale 等标签。通过 man 7 attributes 可以进一步查询这些标签的含义。虽然这个手册可能内容较为抽象,但通过理解这些标签,可以更好地判断函数的线程安全性。 env 标签表示该函数依赖于进程的环境变量。环境变量是全局的,多个线程共享同一个进程的环境变量,因此如果一个线程修改了环境变量,其他线程的读取行为可能会产生不可预知的结果。 举例:getenv() 函数会读取环境变量,由于环境变量是全局的,多个线程同时调用 getenv() 并不会产生冲突,但如果其中一个线程修改了环境变量(如调用 setenv() 或 putenv()),其他线程的 getenv() 结果就可能变得不确定,因此这类函数是条件性线程安全的。 locale 标签表示该函数依赖于区域设置。区域设置(Locale)是一个进程级别的设置,控制着程序如何处理与语言和文化相关的信息,比如日期格式、货币符号、字符编码等。如果多个线程同时更改进程的区域设置,这些更改会影响所有线程。因此依赖区域设置的函数,虽然在某些条件下是线程安全的,但如果区域设置发生变化,可能会导致不安全的情况。 举例:setlocale() 函数用于设置或查询程序的当前区域设置。如果某个线程更改了区域设置,其他依赖区域设置的函数(如 strcoll())可能会受到影响,导致线程不安全。 有些函数是绝对线程安全的,意味着它们不依赖于任何共享资源,或者完全不会受到环境变量和区域设置的影响。例如数学库中的 sqrt() 函数。我们可以通过 man 手册查询到: 这里没有任何附加标签,比如 env 或 locale,表示该函数在任何情况下都是线程安全的。 需要强调的是,可重入函数并不一定就是线程安全的,虽然它们之间有很大的重叠。例如,函数如果只使用局部变量而不依赖全局状态,它通常是可重入的,但并不一定是线程安全的,特别是在函数内部涉及到系统调用时。 可重入函数:可重入函数在每次调用时不会依赖外部状态(如全局变量、静态变量),即便是在中断上下文中或多个线程并发执行时,它也能安全执行。 线程安全函数:线程安全函数意味着多个线程可以同时调用该函数而不会发生数据竞争或冲突,线程安全函数通常通过使用同步机制(如锁)来确保多个线程的正确执行。 让我们通过 ctime() 和 ctime_r() 函数来具体说明不可重入函数和可重入函数的区别。 ctime():不可重入,它返回的字符串是存储在静态缓冲区中的,所有线程共享同一个缓冲区。如果多个线程同时调用 ctime(),会导致缓冲区数据被覆盖,结果不可靠。 ``` #include ``` ``` #include ``` ``` void* unsafe_function(void* arg) { ``` ``` time_t now = time(NULL); ``` ``` printf("ctime: %s\n", ctime(&now)); // 使用静态缓冲区,线程不安全 ``` ``` return NULL; ``` ``` } ``` ctime_r():可重入版本,允许用户传递一个缓冲区,线程之间不共享任何状态,因此是线程安全的。 ``` #include ``` ``` #include ``` ``` void* safe_function(void* arg) { ``` ``` time_t now = time(NULL); ``` ``` char buffer[26]; // 用户传入的缓冲区 ``` ``` printf("ctime_r: %s\n", ctime_r(&now, buffer)); // 线程安全 ``` ``` return NULL; ``` ``` } ``` C 标准库中的很多函数都有可重入与不可重入版本。在多线程编程中,使用可重入函数是确保线程安全的关键之一,但可重入并不总是等同于线程安全。通过了解 man 手册中的 MT-Safe 与 MT-Unsafe 标记,以及带有 env 或 locale 等条件性标签的含义,开发者可以更好地选择合适的函数来避免多线程环境中的潜在问题。 美男子玩编程 分享嵌入式、IoT、AI等技术,海量资源等你来 微信公众号 来源:CSDN博主“不脱发的程序猿”,原文链接:https://handsome-man.blog.csdn.net/article/details/142794719 ![](https://developer.qcloudimg.com/http-save/yehe-8201782/366dfdd7c6744d1161d873d590195b69.png) ![](https://developer.qcloudimg.com/http-save/yehe-8201782/fcd1b1fc2463b96e96444b7bafccfd83.png)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

用户登录
用户注册