进程捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果从信号处理程序返回(例如信号处理程序没有调用exit或longjmp),则继续执行在捕捉到信号时进程正在执行的正常指令序列。但在信号处理程序中,不能判断捕捉到信号时进程在何处执行。如果程序正在执行malloc,在其堆中分配另外的存储空间,而此时由于捕捉到信号而插入执行该信号处理程序,其中又调用malloc,则可能会对进程造成破坏,因为malloc通常为它所分配的存储区维护一张链接表,而插入执行信号处理程序时,进程可能正在更改此链接表。又例如,若进程正在执行getpwnam这种将其结果存放在静态存储单元中的函数,其间插入执行信号处理程序,它又调用这样的函数,则返回给正常调用者的信息可能会被返回给信号处理程序的信息覆盖。
没有列入表10-3中的大多数函数是不可重入的,其原因为:(a)已知它们使用静态数据结构,(b)它们调用malloc或free,或(c)它们是标准I/O函数。
应当了解,即使信号处理程序调用的是列于表10-3中的函数,但是由于每个线程只有一个errno变量,所以信号处理程序可能会修改其原先值。因此,作为一个通用的规则,当在信号处理程序中调用表10-3中列出的函数时,应当在其前保存、在其后恢复errno。
若在信号处理程序中调用一个不可重入函数,则其结果是不可预测的。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
新闻热点
疑难解答