UNIX 信号处理深入解析
1. 信号处理基础回顾
在程序中,我们常常需要对信号进行定义和处理。例如,有这样一个程序示例:
cc -o rsig1 rsig1.o
$ ./rsig1
Waiting for SIGINT..
^CGot SIGINT
Waiting for SIGINT..
^CGot SIGINT
End.
$
这个程序和之前的某个程序功能类似。值得注意的是,在代码的第 32 行添加了对 sigaction(2)
的调用。虽然对于这个程序来说这不是必需的,但它展示了如何恢复信号处理动作。在第 25 行执行时,通过将设置保存到变量 sa_old
中,保存了 SIGINT
的处理动作,而第 32 行则使用 sa_old
恢复了 SIGINT
的处理动作。
2. 信号控制
有时候,我们需要更精确地控制信号何时被触发。在 UNIX 系统中,有多种方法可以实现这一点。
2.1 信号阻塞
在讨论 sigaction(2)
函数时,我们提到在调用信号处理函数期间可以阻塞某些信号。例如,当 SIGINT
信号由信号处理函数处理时,在当前处理函数返回之前,后续的 SIGINT
信号将被阻止触发(除非使用 SA_NOMASK
或