为什么这个信号处理程序不能捕获 SIGHUP 或 SIGQUIT?



我开始练习处理信号,想看看我是否可以阻止使用 SIGHUP 或 SIGQUIT 来停止在与 sigaction 结构相同的程序中执行的进程。但是下面的函数似乎并没有阻止我通过命令行发送 SIGHUP 或 SIGQUIT 来停止该过程。通过在命令行中键入 $ kill -HUP PID# 或 $ kill -QUIT PID# 将关闭进程。我认为通过将我想要阻止的信号添加到掩码中,它将阻止这些信号被传递。使用 sigfillset(( 的结果与 sigaddset(( 相同。我正在使用 ubuntu。谢谢你的帮助。

我们将首先重新读取sa_mask的作用,您设置这些内容的目的是阻止有问题的信号,但这并不是它的作用。

sigaction(2)手册页:

sa_mask  specifies  a  mask  of  signals which should be blocked (i.e.,
added to the signal mask of the thread in which the signal  handler  is
invoked) during execution of the signal handler.

您在执行信号处理程序时唯一阻止的是这些信号。它绝对不会在正常业务过程中处理(或阻止(这些信号。

但是,这无关紧要,因为:

if(execl(argv[1], argv[1], argv[2], argv[3], NULL) == -1) {

显示的代码随后exec一个新进程。从signal(7)手册页中,我们了解了信号处理程序会发生什么:

通过 fork(2( 创建的子项继承了其父级信号 dis- 的副本 位置。 在执行(2(期间,处理 信号重置为默认值;被忽略信号的处置 保持不变。

显示的代码安装信号处理程序。因此,信号处理恢复为默认值,即SIGQUITSIGHUP的进程终止。

忽略信号与在执行信号处理程序时阻止信号不是一回事。要了解如何做到这一点,我们回到sigaction(2)手册页:

sa_handler指定要与 signum 和 可能SIG_DFL默认操作,SIG_IGN忽略此操作 信号,或指向信号处理函数的指针。

您的代码选择门 #3,一个信号处理函数。您的代码应该选择门 #2,SIG_IGN.

最新更新