nginx 源码阅读
10 May 2017

2017-05-09

信号相关知识

https://github.com/y123456yz/reading-code-of-nginx-1.9.2

每个进程有一个信号掩码 (signal mask)。简单地说,信号掩码是一个 “位图”,其中每一位都对应着一种信号。
如果位图中的某一位为 1,就表示在执行当前信号的处理程序期间相应的信号暂时被 “屏蔽”,使得在执行的过程中不会嵌套地响应那种信号。

为什么对某一信号进行屏蔽呢?我们来看一下对 CTRL-C 的处理。
大家知道,当一个程序正在运行时,在键盘上按一下 CTRL-C ,内核就会向相应的进程发出一个 SIGINT 信号,而对这个信号的默认操作就是通过 do_exit() 结束该进程的运行。
但是,有些应用程序可能对 CTRL-C 有自己的处理,所以就要为 SIGINT 另行设置一个处理程序,使它指向应用程序中的一个函数,在那个函数中对 CTRL_C 这个事件作出响应。
但是,在实践中却发现,两次 CTRL-C 事件往往过于密集,有时候刚刚进入第一个信号的处理程序,第二个 SIGINT 信号就到达了,而第二个信号的默认操作是杀死进程。

这样,第一个信号的处理程序根本没有执行完。为了避免这种情况的出现,就在执行一个信号处理程序的过程中将该种信号自动屏蔽掉。

所谓 “屏蔽”,与将信号忽略是不同的,它只是将信号暂时 “遮盖” 一下,一旦屏蔽去掉,已到达的信号又继续得到处理。

所谓屏蔽,并不是禁止递送信号,而是暂时阻塞信号的递送,解除屏蔽后,信号将被递送,不会丢失

设置这些信号都阻塞,等我们 sigpending 调用才告诉我有这些事件