哪个子进程发送SIGCHLD

时间:2013-11-06 14:38:55

标签: c signals sigchld

我正在尝试理解信号处理和处理。我有一个父进程创建了几个子进程。现在在父进程中,我有一个所有子进程的列表。当孩子被终止时,我想从列表中删除它。我知道当孩子被终止时,他会向父母发送SIGCHLD。好的,现在这是一个棘手的部分,我怎么能知道那个孩子是终止还是刚被停职还是其他什么?

3 个答案:

答案 0 :(得分:2)

正如你所说

  

当孩子被终止时,他将SIGCHLD发送给父母

拨打父母致电wait()

要么

  • 通过阻止调用wait()
  • 在一个连续的基地或
  • 设置一个服务SIGCHLD的信号处理程序,然后调用wait()

如果使用选项waitpid()使用-1 pid调用WUNTRACED,然后通过WIFSTOPPED将宏waitpid()应用于值returend,则会告诉WIFSTOPPED过程是停止还是结束。

对于Linux,因为内核版本2.6.10与WCONTINUED相同,适用于{{1}}。

答案 1 :(得分:1)

signal.h - sigaction()中有一个系统调用,类似于 siganl()但更有用。
访问http://man7.org/linux/man-pages/man2/sigaction.2.html

sigaction()的信号处理函数原型如下所示:

void sa_handler(int signo, siginfo_t *si, void *ucontext);

它有一个siginfo_t类型的参数,其中包含有关信号的所有信息,包括发送它的进程的pid。
虽然使用传统的信号处理机制,但可以使用前面的答案中提到的 waitid()来完成,但 waitid()需要 pid 作为其论据之一。

答案 2 :(得分:0)

使用wait()系列函数的options参数(waitpid(),waitid())。

http://linux.die.net/man/2/waitid