【发布时间】:2011-08-07 08:26:11
【问题描述】:
我有一个forks 孩子的程序。
我正在尝试捕捉以下信号:SIGINT、SIGPIPE 和 SIGTERM。
在 Ctrl+c (生成 SIGINT - afaik)我想确保在主程序终止之前杀死子进程,我正在我的信号处理程序中执行.
现在我的期望/理解是父进程将在 Ctrl+c 时自动被杀死。但这并没有发生。
在 Ctrl+c 我得到了 shell 提示,但我仍然可以在 ps 中看到我的进程。所以基本上我的主程序没有被杀死。
我的理解有误吗?
Edit 0:一项观察:在 Ctrl+c 之前,ps 主程序状态显示为S,但在 Ctrl+c 它的I。
【问题讨论】:
-
在您的信号处理程序杀死子进程后,它确实调用了“exit”,对吧?
-
对于 Ctrl+C,您可能根本不需要任何特殊处理,因为此 SIGINT 被发送到终端的前台进程组,其中包括您的子进程,除非您采取措施阻止它。
-
@jilles:哦,是吗?但是我并没有按说创建创建进程组。 CTRL+C 后是否所有子进程都会被清理干净而无需任何特殊工作?
-
是的,尽管 shell 不会等待它们(因此,如果程序在获得 SIGINT 时生成输出,您可能还是要等待它)。这同样适用于带有
%表示法的kill,但不适用于带有pid 的kill。 -
@jilles:“如果程序在获得 SIGINT 时生成输出,您可能还是要等待它” - 我没有得到这部分。我想等什么?让程序完成生成输出?我猜不会。能详细点吗?
标签: c unix signal-handling