信号处理程序函数保持循环
问题描述:
为处理SIGINT信号而创建的函数被卡在一个常量循环中。这个想法是让父进程忽略CTRL-C,但发送给子进程(并且它们将它作为默认进行处理)。当按CTRL-C时,会发生什么情况,信号处理函数被调用,但陷入无限循环。 kill调用应该发送SIGTERM到进程组中的所有进程,发送进程除外。任何帮助,将不胜感激。信号处理程序函数保持循环
功能代码为:
void intHandler(int signum) {
kill(0, SIGTERM);
}
函数调用代码(主)是:
(void) sigset(SIGINT, intHandler);
答
从杀手册页。
如果pid为0,则sig应发送给进程组ID等于发送者进程组ID的所有进程(不包括未指定的一组系统进程),并且进程有权为发送信号。
一无所知的信号不发送给发件人,所以你很可能希望类似:
void intHandler(int signum) {
sigset(SIGINT, SIG_DFL);
kill(0, SIGTERM);
}
这将在发送复位信号处理程序在发送SIGTERM到所有成员之前默认进程组。
“发件人进程除外” - 规范没有这么说。您需要阻止SIGTERM,或者从进程组中删除进程。 – 2011-05-10 02:47:30
或在全球范围内跟踪孩子,明确地“杀死”孩子而不是所有进程。 IIRC,您还可以使用'sigaction'来确保父母忽略'SIGTERM'并在孩子中解除封锁。 – 2011-05-10 02:55:58
我完成了你所说的完全符合我所需要的工作。谢谢 – zetatr 2011-05-10 03:11:01