2
if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, sig_int);

我已经多次看到此代码。这让我很困惑。这样做,只有当信号当前未被忽略时,进程才会捕获信号。

我的问题是:

  1. 我认为signal(SIGINT, sig_int);除非第一个信号函数出现错误,否则永远不会执行,对吗?

  2. 在什么情况下(signal(SIGINT, SIG_IGN) != SIG_IGN)发生?

4

2 回答 2

2

逐行,

if (signal(SIGINT, SIG_IGN) != SIG_IGN)

调用signal返回上一个操作。所以这里发生的事情是我们将信号处理程序设置为SIG_IGN(即忽略信号),然后检查返回值以查看它是否已被忽略。如果之前没有被忽略,那么...

signal(SIGINT, sig_int);

...发生。

因此,换一种说法,“检查是否忽略了 SIGINT,如果没有被忽略,则将信号处理程序设置为 sig_int。” 实际上将信号设置为 SIG_IGN 以比较第一行中的返回值有点奇怪,但这就是正在发生的事情。

编辑: signal() 也可以返回 SIG_ERR,这是需要考虑的其他事情。

于 2013-02-22T05:39:44.197 回答
1

完全正确,signal如果中断,将返回其先前的 sig 值 (SIG_IGN) 或 SIG_ERR。所以代码的意思是,如果将错误交给 SIG_IGN 时出现问题(记录并忽略它),那么程序会再次捕获信号并将其传递给函数 sig_int,该函数必须以其他方式处理它。

来源: http: //linux.die.net/man/2/signal

至于什么时候会发生,这里的网站表明了这一点:

如果信号不能满足请求,它会返回 SIG_ERR。为此函数定义了以下 errno 错误条件:

EINVAL
You specified an invalid signum; or you tried to ignore or provide 
a handler for SIGKILL or SIGSTOP.

由于 SIGKILL 和 SIGSTOP 不能被捕获或处理,id 说第二个命令被调用的唯一方法是如果 SIG_IGN 不知何故是错误的?

于 2013-02-22T05:38:32.970 回答