linux signal

*信号之于进程,很像中断之于cpu.

内核对"进程信号"的支持,是在进程从内核空间返回用户态的前夕:可能是时钟中断,页异常陷入的内核又返回,也可能是原先睡着,现在等到某个资源,重新进入调度队列而返回.

*信号的中断处理代码由用户部署在用户空间,所以进程返回用户空间之前,是先去用户空间执行代码,执行完了,cpu重新回到内核,接着原来的断点返回.

*旧的unix上,对于套嵌信号的防范是:

用户设置了信号,进入信号handler之前,把这个信号的handler恢复到默认,这样就可以防止同一个信号造成用户的handler重入了.也因此linux上signal()的行为是一次性的,需要在handler里再次设置.(感觉这个设计思路不可思议)

但仍旧是不可靠的,内核调用用户的handler之前,把handler重置,但是用户没来的及调用新的signal()函数,这个信号又被触发了.

触发的是default handler,对ctrl-c这样的信号,会导致进程意外的流产(用户频繁的按ctrl-c).

后来提供了可靠信号的概念,就是相当于又增添了一个"中断屏蔽寄存器"的数据结构.

相关推荐