12-总结
21.6 总结
本章讨论了影响信号处理器函数操作与设计的一系列因素。
由于没有对信号排队,故而在为处理器编码时,有时必须要考虑特定类型信号多次发生的可能性,即使之前信号只产生过一次。可重入问题会影响到对全局变量的修改方式,还限制了可从信号处理器函数中安全调用的函数范围。
除了返回之外,信号处理器函数的终止还存在多种其他方法,其中包括:调用_exit(),发送信号来终止进程(kill()、raise()或abort()),或者执行非本地跳转。借助于sigsetjmp()和siglongjmp(),可以在执行非本地跳转时为程序提供处理信号掩码的显式控制手段。
可以使用sigaltstack()来为进程定义备选信号栈。这是调用信号处理器函数时,用来替代标准进程栈的一块内存。当标准栈因增长过大(内核会在此时向进程发送SIGSEGV信号)而消耗殆尽时,备选栈就特别有用。
如果在调用sigaction()时设置了SA_SIGINFO标志,那么所创建的信号处理器函数就能接收信号的附加信息。siginfo_t结构提供了这些信息,其地址则传递给信号处理器作为参数。
如果信号处理器函数中断了阻塞的系统调用,系统调用会产生EINTR错误。利用这种特性,就可以为阻塞的系统调用设置一个定时器。如果有意,可以手动重启遭到中断的系统调用。另外,在调用sigaction()创建信号处理器函数时,如果设置了SA_RESTART标志,那么大部分(但非全部)系统调用都将会自动重启。
更多信息
参考20.15节所列信息来源。