2

我正在使用 fork 创建子进程和父进程,并使用管道在它们之间发送和接收消息。我正在运行带有一些输入的父进程并调用子进程。如果父进程成功执行,子进程将自动终止但是如果我在父进程运行时按 ctrl+c 或者如果有任何分段错误,则父进程被杀死但子进程没有被杀死。

当父进程突然中断时,任何人都可以向我发布杀死子进程的逻辑吗?

4

1 回答 1

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.
于 2012-12-08T10:05:23.100 回答