我试图了解信号处理和过程。我有一个创建多个子进程的父进程。现在在父进程中,我有一个所有子进程的列表。当孩子被终止时,我想将其从列表中删除。我知道当孩子被终止时,他会发送SIGCHLD
给父母。好的,现在这是棘手的部分,我怎样才能知道那个孩子是终止了还是只是暂停了或其他什么?
问问题
4251 次
3 回答
3
如你所说
当一个孩子被终止时,他正在向父母发送 SIGCHLD
拨打家长电话wait()
。
任何一个
- 通过阻塞调用
wait()
或 - 在一个连续的基础上或
- 通过设置一个信号处理程序服务
SIGCHLD
,然后调用wait()
.
如果调用waitpid()
了-1
使用该选项的 pid,WUNTRACED
然后将宏WIFSTOPPED
应用于返回的值,waitpid()
它会告诉您进程是停止还是结束。
对于自内核版本 2.6.10 起的 Linux,与WIFSTOPPED
适用于WCONTINUED
.
于 2013-11-06T14:44:39.373 回答
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作为其参数之一。
于 2013-11-06T16:03:26.997 回答
0
使用 wait() 系列函数 (waitpid(),waitid()) 的 options 参数。
于 2013-11-06T14:41:27.270 回答