首页 > 代码库 > 信号(三)---早期signal函数和现代signal函数的一些对比

信号(三)---早期signal函数和现代signal函数的一些对比

使用signal函数的一些缺点:
  • 由于signal函数调用成功时会返回原来信号处理程序的指针,所以如果我想要利用signal函数来获取原先信号处理程序的指针的话,必须要先去改变其信号处理方式。如下图所示

技术分享

技术分享
  • 在早期的signal函数的实现中,使用signal函数安装的信号处理函数只能使用一次;在第一次捕捉到该信号的时候,就去执行安装的信号处理函数,同时内核会将该信号的信号处理方式修改为默认方式。下次进程再次收到这个信号的时候,进程将会执行信号的默认动作。但是现在的signal函数的实现并不是这样的,只要使用signal函数安装一次信号处理函数就可以永久使用该信号处理函数。究其根本原因,在于signal函数最终调用了sigaction函数,并且传递的参数中含有SA_ONESHOT这个标志,而早期的signal函数调用的sigaction中,并没有传递SA_ONSHOT这个标志。在现在的操作系统中,使用sysv_signal函数来代表早期的signal函数。
  • 早期的signal函数实现在执行某信号的信号处理函数的时候并不会屏蔽该信号,执行信号处理函数的期间如果再次收到了该信号,进程将立即执行信号的默认动作(由于早期signal函数实现只能使用信号处理函数一次)。但是现代的signal函数实现中都会阻塞该信号,会等到本次信号处理函数执行完毕后再去处理收到的信号。
  • 早期的signal函数会中断某些系统调用,现代的signal函数不会出现这个问题,具体的后面的文章再细分析。

信号(三)---早期signal函数和现代signal函数的一些对比