引言: 通过学习本章可以学会设计信号处理器函数的设计规范,以及设计方法(比如非本地跳转的应用)
1.设计信号处理器函数
引言:信号处理器函数应设计的越小越好 降低竞争条件的引发风险 个人理解在多线线程程序中
1> 可重入函数和异步信号函数
首先讨论什么是可重入函数以及不可重入函数 其实题主简单的理解便是 当一个函数在调用中使用了全局或静态变量时将这些数据进行更改,那么在多线程程序中,因为线程切换是无法预知的所以就无法判断另一个线程中调用这个全局或静态变量时这个的值是否正确。这就导致了函数的不可重入性。
还是看一看SUSv3中的官方对于可重入函数的定义吧函数由两条及以上的线程运行时,即便交叉运行效果也跟线程任意次序调用时一致
例如: malloc 因为维护一个已经释放的内存块的链表 所以当多线程程序使用malloc的时候就会破坏这个链表中的数据,这样子数据的不准确必然会导致申请空间时的不准确或者说错误 还有printf 因为其中会用到内存缓冲区 所以也会导致这种问题
2> 标准的异步信号安全函数
定义:什么是标准的异步信号安全函数 ,也就是说当信号处理器函数调用这个函数的时候可以保证其实现是安全的,具体来说就是某函数是可重入并且信号不会将其中断的函数
两种编写信号处理器函数的方法
- 确保处理器函数调用的全都是不可重入且异步信号安全的函数
- 当执行处理器函数的时候阻塞信号
1) 信号处理器函数对于errno 的使用
因为errno在发生错误的时候会被改变这是无法避免的 所以可以采用一个小小的技巧来保证处理器函数对errno的使用
void handler(int sig){
int savedErrno;
savedErrno = errno;
/*do some thing */
// 复原
errno = savedError;
}
2) 对于全局变量的使用 并且全局变量的使用应该总是使用关键字 volatile 关键字,从而防止编译器优化到寄存器中
3)struct sig_atomic_t 数据类型 这个现在就是说最好所有的处理器之间共享的全局变量都设置成这个类型 具体的使用 之后在这里补充或者在信号(3)中给出
挺重要的 这个可以实