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