重读APUE(11)-信号安全的可重入函数
重入时间点
进程捕捉到信号并对其进行处理时,进程正在执行的正常指令序列就会被信号处理程序临时中断,它首先执行该信号粗合理程序中的指令;如果从信号处理程序返回,则继续执行捕捉到信号时进程正在执行的正常指令序列;
ps:如果了解驱动,上面这段信号打断流程与中断打断进程上下文很类似;
不可重入函数
对于有些函数,是不可重入的,如果信号处理程序打断了这些函数的执行,同时信号粗合理程序中也调用这个函数,就会发生错误;这些不可重入的函数,有如下特点:
1. 使用了静态的数据结构;
2. 调用了malloc或者free;
3. 是标准的I/O函数;标准IO库的很多实现都以不可重入方式使用全局数据结构;
我们自己写程序时,应该尽量的注意将函数实现为可重入,如果不可重入,则需要进行锁保护;
信号安全的函数
下面的列表为异步信号安全的函数,除了可重入以外,在信号处理操作期间,它会阻塞任何引起不一致信号的发送;也就是说信号处理程序可以安全的调用这些函数;

errno
即使使用了信号安全的函数,但是由于每个线程只有一个errno,所以信号处理程序可能会修改它原来的值;作为一个通用规则,在信号处理程序中调用上图中的函数时,应当在调用前堡村errno,在调用后恢复errno;(经常被捕获到的信号是SIGCHLD,其信号处理程序通常要调用一种wait函数,而各种wait函数多能改变errno)
区分信号安全和线程安全的可重入
信号安全的可重入函数与线程安全的可重入函数不是一回事,注意区分;
重读APUE(11)-信号安全的可重入函数的更多相关文章
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- 信号处理signal、sigaction、pause、信号嵌套处理、不可重入函数
信号的捕捉和处理 主要由signal和sigaction函数来完成.还有一个函数pause,它可用来响应任何信号,不过不做任何处理. 1.signal函数 typedef void (*sighand ...
- linux系统编程之信号(四):alarm和可重入函数
一,alarm() 在将可重入函数之前我们先来了解下alarm()函数使用: #include <unistd.h> unsigned int alarm(unsigned int sec ...
- (转载)可重入函数(reentrant function)
(转载)http://blog.163.com/xu_jin_rong/blog/static/1491966220086775017178 由于cublog系统的缘故,将前段时间写的一篇blog文章 ...
- c中的可重入和不可重入函数
可重入和不可重入 的基本概念 ---简介--- 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段 ...
- [Linux]不可重入函数
一.概述 怎么会有可重入和不可重入. 在多任务系统下,中断可能在任务执行的任何时间发生:如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是 ...
- Linux可重入函数和线程安全的区别与联系(转)
*****可重入函数 函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入. 当程序运行到某一个函数的时候,可能因为硬件中断或者异常而使得在用户正在执行的代码暂时终端转而 ...
- Use Reentrant Functions for Safer Signal Handling(译:使用可重入函数进行更安全的信号处理)
Use Reentrant Functions for Safer Signal Handling 使用可重入函数进行更安全的信号处理 How and when to employ reentranc ...
- 可重入函数、线程安全、volatile
一. POSIX 中对可重入和线程安全这两个概念的定义: Reentrant Function:A function whose effect, when called by two or more ...
随机推荐
- 新学WEB前端
介绍一点关于我对学习前端的一些学习经验和遇到的问题! 1.坚持 现在编码技术更新的速度日新月异,并且对于纯英文字母的代码来说,我们不是长时间接触并且记忆的话,对于一些难一些的标签和属性是非常容易忘记的 ...
- vue基本语法概要(一)
先看两种代码,再进行讲解 第一种格式: <template > <div> <div v-for=" item in sites "> < ...
- git 从存储库中删除敏感数据(删除文件历史)
1.如果您的历史记录中还没有包含敏感数据的存储库的本地副本,请将存储库克隆到本地计算机. git clone https://github.com/YOUR-USERNAME/YOUR-REPOSIT ...
- VUE 单选下拉框Select中动态加载 默认选中第一个
<lable>分类情况</lable> <select v-model="content.tid"> <option v-for=&quo ...
- 使用fastjson统一序列化响应格式
摘要:其实很简单的处理方式,只不够优雅,或者说没有找到fastjson为其提供便捷的处理方式.因此记录下处理该问题的过程. 目标:将所有api请求,即响应为APPLICATION_JSON的内容做统一 ...
- TCP、Http和Socket 优劣比较
转自:http://www.cnblogs.com/webwlsong/p/3198712.html 了解HTTP和Socket之前先对网络7层协议有个了解: 7 应用层6 表示层5 会话层 4 传输 ...
- 如何用pycharm 控制远程服务器来跑代码!!!!!!!!!!!!非常牛逼
2019-09-04,10点58 想弄一个pycharm的插件,就是用deployment同步代码的时候,在pycharm里面运行代码,的时候本机不动,而是远程服务器运行,然后把结果返回!!!!!!挺 ...
- OPT
http://cdn.imgtec.com/sdk-documentation/PowerVR.Performance+Recommendations.pdf 宝贝 https://developer ...
- 后缀自动机求endpos集大小
#include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define LNF ...
- React中生命周期
1.过时的生命周期(v16.3之前) 1.当前组件初次渲染: 绿色表示执行顺序. constructor(): 如果不需要初始化,可以直接省略,会自动补全该函数. 可以在这个方法中初始化this.st ...