信号处理程序函数保持循环

问题描述:

为处理SIGINT信号而创建的函数被卡在一个常量循环中。这个想法是让父进程忽略CTRL-C,但发送给子进程(并且它们将它作为默认进行处理)。当按CTRL-C时,会发生什么情况,信号处理函数被调用,但陷入无限循环。 kill调用应该发送SIGTERM到进程组中的所有进程,发送进程除外。任何帮助,将不胜感激。信号处理程序函数保持循环

功能代码为:

void intHandler(int signum) { 
kill(0, SIGTERM); 

}

函数调用代码(主)是:

(void) sigset(SIGINT, intHandler); 
+0

“发件人进程除外” - 规范没有这么说。您需要阻止SIGTERM,或者从进程组中删除进程。 – 2011-05-10 02:47:30

+0

或在全球范围内跟踪孩子,明确地“杀死”孩子而不是所有进程。 IIRC,您还可以使用'sigaction'来确保父母忽略'SIGTERM'并在孩子中解除封锁。 – 2011-05-10 02:55:58

+0

我完成了你所说的完全符合我所需要的工作。谢谢 – zetatr 2011-05-10 03:11:01

从杀手册页。

如果pid为0,则sig应发送给进程组ID等于发送者进程组ID的所有进程(不包括未指定的一组系统进程),并且进程有权为发送信号。

一无所知的信号不发送给发件人,所以你很可能希望类似:

void intHandler(int signum) { 
    sigset(SIGINT, SIG_DFL); 
    kill(0, SIGTERM); 
} 

这将在发送复位信号处理程序在发送SIGTERM到所有成员之前默认进程组。

+0

啊,我明白了。那么代码仍然不会终止父进程呢?我需要父进程继续并终止子进程。 – zetatr 2011-05-10 03:03:44

+0

决定使用全局变量来跟踪子进程pid。 – zetatr 2011-05-10 03:11:49

+0

嗯,重置SIGINT信号处理程序不会阻止SIGTERM杀死进程。 – 2011-05-10 06:09:22