【问题标题】:parent process and child processes, if one exits, how to inform the other exits?父进程和子进程,如果一个退出,如何通知另一个退出?
【发布时间】:2013-07-01 16:25:53
【问题描述】:

如果我在我的 linux C 程序中生成一个进程并且总共有 2 个进程,一个父进程和一个子进程。我想要:如果这两个进程之一退出,另一个进程也退出。

如何做到这一点? 有没有类似的源码?

注意:我不想同时阻塞两个进程,例如,我不希望父进程被wait()阻塞

谢谢!

【问题讨论】:

标签: c linux multiprocessing


【解决方案1】:

在父进程中,您可以使用waitpid 系统调用。它会一直阻塞,直到孩子退出。

在子进程中不能使用waitpid。一种选择是父亲将在退出时通过发送SIGTERM 通知孩子。但这只有在父亲不会被 SIGKILL 杀死的情况下才有效。我建议定期使用kill 和参数0 向父进程发送信号。如果失败,则进程终止。

来自kill(2) man page

如果sig为0,则不发送信号,但仍进行错误检查;这可用于检查进程 ID 或进程组 ID 是否存在。

【讨论】:

    【解决方案2】:

    如果子节点退出,父节点将收到SIGCHLD。如果父母要死了,它应该以某种方式通知孩子,或者至少给它发一个SIGTERM

    【讨论】:

    • 如果使用SIGKILL 终止父亲会怎样。然后孩子不会收到 SIGTERM
    • 然后您可以使用信号处理函数进行清理。
    • @V_Maenolis 你无法处理SIGKILL
    • @hek2mgl 那是我的错。我已经忘记了。我刚刚做了一个快速的研究。
    • @V_Maenolis 我会在子进程中使用kill(pid, 0); 来主动检查父亲是否还活着。如有必要,这可以在单独的线程中运行。
    【解决方案3】:

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

    等待任何子进程,然后在从 waitpid 返回时退出。

    【讨论】:

    • 也有可能是父进程先退出
    • 不,当您退出 waitpid 时,您只是杀死了您的子组。呃。每件小事都必须明确吗?它的常识,就像这个问题一样。
    【解决方案4】:

    如果父进程退出,则子进程成为僵尸进程。

    如果子进程退出,可以通过wait系统调用通知父进程。您可以通过读取父级的状态退出父级。

    【讨论】:

    • 如果父级退出,子级由init 继承,即定义为pid 1。如果(当前)父母没有处理自己的死者,孩子就会变成僵尸。
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多