信号是软件中断。由于信号本质上是异步的,也是不可重入的。如果某个函数使用并修改了某个公共对象,那它就是不可重入的;如果两个调用使用同一对象,那么它们会相互干扰。
经验
1. 返回指向静态数据的指针可能会导致函数不可重入。
2.
记忆数据的状态会使函数不可重入。还是由于static。
3.
在大部分系统中,
因为它们使用静态数据结构来记录哪些内存块是空闲的。实际上,任何分配或释放内存的库函数都是不可重入的。这也包括分配空间存储结果的函数。
避免在处理器分配内存的最好方法是,为信号处理器预先分配要使用的内存。避免在处理器中释放内存的最好方法是,
标记或记录将要释放的对象,让程序不间断地检查是否有等待被释放的内存。不过这必须要小心进行,因为将一个对象
添加到一个链并不是原子操作,如果它被另一个做同样动作的信号处理器打断,那么就会“丢失”一个对象。不过,
如果您知道当信号可能到达时,程序不可能使用处理器那个时刻所使用的流,那么就是安全的。如果程序使用的是某些其他流,那么也不会有任何问题。
4.
为了编写没有 bug 的代码,要特别小心处理进程范围内的全局变量,如
在信号处理器内保存和恢复
5.
如果底层的函数处于关键部分,并且生成并处理信号,那么这可能会导致函数不可重入。
(1) 保存当前信号设置。
(2) 用不必要的信号屏蔽信号设置。
(3) 使代码的关键部分完成其工作。
(4) 最后,重置信号设置。
经验
1. 返回指向静态数据的指针可能会导致函数不可重入。
2.
记忆数据的状态会使函数不可重入。还是由于static。
3.
在大部分系统中,
malloc 和 free 都不是可重入的,因为它们使用静态数据结构来记录哪些内存块是空闲的。实际上,任何分配或释放内存的库函数都是不可重入的。这也包括分配空间存储结果的函数。
避免在处理器分配内存的最好方法是,为信号处理器预先分配要使用的内存。避免在处理器中释放内存的最好方法是,
标记或记录将要释放的对象,让程序不间断地检查是否有等待被释放的内存。不过这必须要小心进行,因为将一个对象
添加到一个链并不是原子操作,如果它被另一个做同样动作的信号处理器打断,那么就会“丢失”一个对象。不过,
如果您知道当信号可能到达时,程序不可能使用处理器那个时刻所使用的流,那么就是安全的。如果程序使用的是某些其他流,那么也不会有任何问题。
4.
为了编写没有 bug 的代码,要特别小心处理进程范围内的全局变量,如
errno 和 h_errno。在信号处理器内保存和恢复
errno 的值,可以解决这一问题。5.
如果底层的函数处于关键部分,并且生成并处理信号,那么这可能会导致函数不可重入。
(1) 保存当前信号设置。
(2) 用不必要的信号屏蔽信号设置。
(3) 使代码的关键部分完成其工作。
(4) 最后,重置信号设置。





