我正在使用fork来创建子进程和父进程,并使用管道在它们之间发送和接收消息。我正在使用一些输入运行父进程并调用子进程。如果父进程成功执行,子进程是自动被杀但如果我在父进程运行时按ctrl + c或者有任何分段错误,则父进程被杀死但子进程没有被杀死。
当父进程中断时,有人可以发布杀死子进程的逻辑吗?
答案 0 :(得分:1)
由于您已经使用管道进行通信,因此这应该很容易。
管道读取阻塞,直到有数据要读取,如果父进程是编写器并且死亡,则立即得到EOF
。如果你的父进程永远不会关闭它的写入结束,那么你就有了一种可靠的方法来检测死亡。
如果在没有读者的情况下忽略信号,则管道写入命中SIGPIPE
并从呼叫返回EPIPE
。
在孩子中,选择(如果可以阻止)管道的fd并在适当的时候终止该过程。没有SIGCHLD
等同于父亲死亡。
man 7 pipe
有一个很好的概述。摘录:
If all file descriptors referring to the write end of a pipe have been closed, then an attempt to read(2) from
the pipe will see end-of-file (read(2) will return 0). If all file descriptors referring to the read end of a
pipe have been closed, then a write(2) will cause a SIGPIPE signal to be generated for the calling process. If
the calling process is ignoring this signal, then write(2) fails with the error EPIPE. An application that
uses pipe(2) and fork(2) should use suitable close(2) calls to close unnecessary duplicate file descriptors;
this ensures that end-of-file and SIGPIPE/EPIPE are delivered when appropriate.