重读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 ...
随机推荐
- ccs编译.lib
新建 New一个CCS Project Output type选择"Static Library" 添加源文件 右击工程 -> Add Files- 编译 编译生成的.lib ...
- graph Laplacian 拉普拉斯矩阵
转自:https://www.kechuang.org/t/84022?page=0&highlight=859356,感谢分享! 在机器学习.多维信号处理等领域,凡涉及到图论的地方,相信小伙 ...
- 批量删除redis
批量删除"aso_"开头的key:redis-cli keys aso_* | xargs redis-cli del
- JAVA面试核心教程|Java面试基础知识点总结
Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? byte——1 byte——Byte short——2 bytes——Short int——4 bytes——Integer lon ...
- MyBaties --day1
今天就来聊聊这个东西 今天的主角相信大家也看到了 MyBaties 是个什么东东 它有什么作用?怎么用?好不好用今天来说说 .说到MyBaties 就不得不谈到JDBC大家可能都知道 JDBC用来操 ...
- javascript 给事件任务一个缓冲区
在编写前端的过程中,经常会监听事件并执行任务,我在这抛出2个比较常见的场景: 1.输入关键字搜索如果你监听input的chage事件,会有一个问题,在使用中文输入法时,你输入的几个拼音字母都会被触发我 ...
- jade继承
代码的复用是jade非常突出的一个设计目标,jade不仅仅通过mixin来复用代码,他在文件的组织能力上也非常突出,说白了,就是继承和包涵 block定义的方式和调用的方式 block desc ...
- MySQL 进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接
#进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接 /* 含义: 当查询的字段来自于多个表时, 就会用到连接查询 一: sql 92标准 :等值连接 ,(#内连接) 1 ...
- 洛谷P1273 有线电视网【树形dp】
题目:https://www.luogu.org/problemnew/show/P1273 题意:一棵树,叶子节点是用户,每天边有一个权值表示花费,每一个用户有一个值表示他们会交的钱. 问在不亏本的 ...
- Luogu P3690【模板】Link Cut Tree (LCT板题)
省选前刷道LCT板题(话说之前没做这道题-) CODE #include<bits/stdc++.h> using namespace std; inline void read(int ...