if (signal(SIGINT, SIG_IGN) != SIG_IGN)
signal(SIGINT, sig_int);
我已多次看过这段代码。它让我很困惑。执行此操作时,仅当信号当前未被忽略时,该过程才会捕获信号。
我的问题是:
我认为signal(SIGINT, sig_int);
永远不会被执行,除非第一个信号函数出错,是不是?
(signal(SIGINT, SIG_IGN) != SIG_IGN)
发生在哪种情况?
答案 0 :(得分:2)
逐行
if (signal(SIGINT, SIG_IGN) != SIG_IGN)
对signal
的调用会返回上一个操作。所以这里发生的是我们将信号处理程序设置为SIG_IGN
(即忽略信号),然后检查返回值以查看它是否已被忽略。如果之前没有被忽略,那么......
signal(SIGINT, sig_int);
...发生。
因此,表达了一种不同的方式,“检查SIGINT是否被忽略,如果没有被忽略,请将信号处理程序设置为sig_int。”实际上将信号设置为SIG_IGN以比较第一行中的返回值有点奇怪,但这就是发生的事情。
编辑:signal()也可以返回SIG_ERR,这是另外需要考虑的事情。
答案 1 :(得分:1)
这是完全正确的,signal
将返回其先前的sig值(SIG_IGN)或SIG_ERR(如果它中断)。所以代码正在做的是,如果将SIG_IGN传递给错误(记录并忽略它)时出现问题,则程序再次捕获信号并将其传递给函数sig_int,该函数必须以其他方式处理它。
来源:http://linux.die.net/man/2/signal
至于何时会发生,网站here表示:
如果信号不能满足请求,则返回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是否错误?