信号:何时会出现这种情况?

时间:2013-02-22 05:22:43

标签: c linux signals

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

我已多次看过这段代码。它让我很困惑。执行此操作时,仅当信号当前未被忽略时,该过程才会捕获信号。

我的问题是:

  1. 我认为signal(SIGINT, sig_int);永远不会被执行,除非第一个信号函数出错,是不是?

  2. (signal(SIGINT, SIG_IGN) != SIG_IGN)发生在哪种情况?

2 个答案:

答案 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是否错误?