信号处理机制详解
1. 信号的作用
信号在操作系统中扮演着重要的角色,具有适当权限的进程可以分别终止和停止其他进程,而不受目标进程所执行程序的保护机制影响。当一个信号的传递导致内核杀死某个进程时,该信号对这个进程来说就是致命的。例如,SIGKILL 信号总是致命的,此外,如果一个信号的默认动作是“终止”,并且该进程没有捕获这个信号,那么这个信号对该进程也是致命的。但需要注意的是,如果一个进程捕获了某个信号,并且其对应的信号处理函数终止了该进程,那么这个信号就不是致命的,因为是进程自己选择终止,而非被内核杀死。
2. POSIX 信号与多线程应用
POSIX 1003.1 标准对多线程应用的信号处理有严格要求:
- 信号处理函数必须在多线程应用的所有线程之间共享,不过每个线程必须有自己的待处理和阻塞信号掩码。
- POSIX 库函数 kill() 和 sigqueue() 必须将信号发送给整个多线程应用,而不是特定的线程。内核生成的所有信号(如 SIGCHLD、SIGINT 或 SIGQUIT)也是如此。
- 发送给多线程应用的每个信号将仅传递给一个线程,该线程由内核在不阻塞该信号的线程中任意选择。
- 如果向多线程应用发送致命信号,内核将杀死该应用的所有线程,而不仅仅是接收到信号的那个线程。
为了符合 POSIX 标准,Linux 2.6 内核将多线程应用实现为属于同一线程组的一组轻量级进程。在本文中,“线程组”这个术语可以表示任何线程组,即使它由单个(传统)进程组成。“进程”可以指传统进程或轻量级进程,即线程组中的特定成员。此外,如果一个待处理信号是发送给
超级会员免费看
订阅专栏 解锁全文
5096

被折叠的 条评论
为什么被折叠?



