当我为先前忽略的信号注册信号处理程序时会发生什么

时间:2018-04-24 05:31:49

标签: c signals

以下代码来自GNU manual about signal handling

中的示例
...
if (signal(SIGINT, termination_handler) == SIG_IGN)
    signal(SIGINT, SIG_IGN);
...

手册说,

  

请注意,如果先前已将某个给定信号设置为忽略,则此代码可避免更改该设置。这是因为非工作控制炮弹在开始生孩子时经常会忽略某些信号,因此孩子们必须尊重这一点。

我不理解为什么在开始我的进程之前非作业控制shell会忽略某些信号时忽略被忽略的信号。 ("非工作控制炮弹"是什么意思?)

我在我的书中找到了类似的部分,“Linux系统编程”#39;由Robert Love撰写。这本书说,

  

首次执行进程时,所有信号都设置为默认操作,除非父进程(执行新进程的进程)忽略它们;在这种情况下,新创建的进程也将忽略这些信号。换句话说,父进程捕获的任何信号都将重置为新进程中的默认操作,并且所有其他信号保持不变。这是有道理的,因为新执行的进程不共享其父进程的地址空间,因此任何已注册的信号处理程序可能都不存在。

     

这个关于流程执行的行为有一个值得注意的用途:当shell执行一个进程"在后台" (或者当另一个后台进程执行另一个进程时),新执行的进程应该忽略中断并退出字符。

     

因此,在shell执行后台进程之前,它应该将SIGINT和SIGQUIT设置为SIG_IGN。因此,处理这些信号的程序首先检查以确保它们不被忽略是很常见的。

我尝试为SIGINT注册信号处理程序(不检查是否忽略)并在后台运行它(只是为了看看如果我做了他们所说的不做的事情会发生什么)。

$ ./my_program &

但没有什么特别的事情发生。

当我为先前忽略的信号注册信号处理程序时会发生什么?

0 个答案:

没有答案