【问题标题】:Which child process send SIGCHLD哪个子进程发送 SIGCHLD
【发布时间】:2013-11-17 20:33:48
【问题描述】:

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

【问题讨论】:

  • WIFSIGNALED 和 WIFSTOPPED,宏应用于wait返回的状态
  • @William Pursell,但如果进程暂停,它将停留在wait,直到终止

标签: c signals sigchld


【解决方案1】:

如你所说

当孩子被终止时,他正在向父母发送 SIGCHLD

拨打家长电话wait()

要么

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

如果使用WUNTRACED 选项以-1 的pid 调用waitpid(),然后将宏WIFSTOPPED 应用于waitpid() 返回的值,它会告诉您进程是停止还是结束。

对于自内核版本 2.6.10 起的 Linux,与 WIFSTOPPED 的相同适用于 WCONTINUED

【讨论】:

  • 我查看了waitwaitpid 的手册页,发现wait 没有option 字段(waitpid 有)
【解决方案2】:

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作为其论据之一。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2015-01-20
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多