1

我试图了解信号处理和过程。我有一个创建多个子进程的父进程。现在在父进程中,我有一个所有子进程的列表。当孩子被终止时,我想将其从列表中删除。我知道当孩子被终止时,他会发送SIGCHLD给父母。好的,现在这是棘手的部分,我怎样才能知道那个孩子是终止了还是只是暂停了或其他什么?

4

3 回答 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 参数。

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

于 2013-11-06T14:41:27.270 回答