父进程和子进程,如果其中一个退出,如何通知另一个退出?

3
如果我在Linux C程序中生成一个进程,总共有两个进程,一个父进程和一个子进程。我希望:如果这两个进程中的任何一个退出,另一个进程也会退出。
如何实现这一点? 是否有类似的源代码?
注意:我不想阻塞两个进程,例如,我不希望使用wait()函数阻塞父进程。
谢谢!

检查子进程的结束:https://dev59.com/THE95IYBdhLWcg3wSb7P - VoidPointer
1
阅读http://advancedlinuxprogramming.com/,其中有一个完整的章节来回答这个问题。 - Basile Starynkevitch
4个回答

4
在父进程中,您可以使用waitpid系统调用。它会一直阻塞直到子进程退出。
在子进程中,您无法使用waitpid。一种选择是,父进程将在退出时向子进程发送SIGTERM来通知它。但是,如果使用SIGKILL杀死父进程,这种方法就不可行了。我建议使用kill参数为0定期向父进程发送信号。如果此操作失败,则进程已终止。
kill(2) man页面

如果sig为0,则不发送任何信号,但仍然执行错误检查;可以使用此项功能检查进程ID或进程组ID的存在性。


1
如果子进程退出,父进程将接收到一个 SIGCHLD 信号。如果父进程即将终止,它应该以某种方式通知子进程,或者至少发送一个 SIGTERM 信号。

如果父进程使用 SIGKILL 被终止,那么子进程就不会收到 SIGTERM - hek2mgl
然后,您可以使用信号处理函数来执行清理工作。 - Varvarigos Emmanouil
@V_Maenolis 你无法处理 SIGKILL - hek2mgl
@hek2mgl,那是我的错。我忘记了。我刚做了一个快速的研究。 - Varvarigos Emmanouil
@V_Maenolis 我会在子进程中使用 kill(pid, 0); 主动检查父进程是否仍然活着。如果需要的话,这可以在单独的线程中运行。 - hek2mgl

0

父进程先退出也是可能的。 - user1944267
不,当你退出waitpid时,你只是杀死了你的子进程组。 显然。 每件小事都必须明确吗? 这是常识,就像这个问题一样。 - KrisSodroski

-1
如果父进程退出,则子进程将成为僵尸进程。
如果子进程退出,父进程可以通过wait系统调用得到通知。您可以通过读取其状态来退出父进程。

如果父进程退出,子进程将被init继承,因为根据定义,init的pid为1。如果(当前)父进程没有处理子进程自己的死亡,则子进程会变成僵尸进程。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接