通过 pid 监听来自进程的信号

Listen a signal from a processus by pid

考虑两个进程 A 和 B,标准输入和输出流通过管道相互连接以形成闭环。假设,作为 exec 的结果,两个进程并不直接知道它们彼此之间的关系。

如果 B 突然终止(例如通过发送 SIGKILL),A 怎么知道 B 死了?或者至少,让A也死

快速查看情况,其中 Cmd 是 A 和 B 客户端:

"A" 在写入消费者被杀死的管道时收到 SIGPIPE 信号。

您可以为 SIGPIPE 注册处理程序并优雅地处理它。

据我了解,您唯一需要处理的就是管道。没有其他方法可以帮助您执行 exec,特别是如果我们假设进程 A 中的程序 运行 不是专门为这种交互设计的。因此,让我们考虑一下您可以用这些管道做什么。

B 终止时,无论出于何种原因,它所有打开的文件句柄都将关闭。这包括它在管端的把手。

如果A此后尝试写入自己的stdout,并且读端在任何进程中都没有打开,* 然后 A 将收到一个 SIGPIPE,正如@indianant 观察到的那样。该信号的默认配置是终止进程,因此 A 也会终止,除非它更改了该信号的配置。 A 是否改变 SIGPIPE 的配置是你无法控制的,除非 A 中的程序 运行 是你的'已经提供了。

但也许 AB 终止时会被阻止从其标准输入读取。假设 B 是唯一保持该管道写端打开的进程,那么 A 将在其标准输入上看到 EOF。这不会自动导致 A 终止,但它可以适当地响应该事件,这可能会导致它自然终止。此外,A在终止前可能先接收到B写入的数据;如果 A 通过尝试写入其标准输出来响应,则上一段适用。

但是,

None 适用,除非 A 实际上在其标准流上执行 I/O。如果您正在寻找某种异步通知,那么您可能需要让第三方进程负责。为此目的,最简单的方法是为 AB 提供一个通用的 parent 进程,可能是一个专门用于此目的的进程。 parent 将通过 SIGCHLD 或从 wait()waitpid() 返回通知,当其 children 之一死亡时;然后它可以采取适当的行动,例如杀死另一个 child。请注意,这不适用于 A 作为 Bvise versa 的 parent,因为信号处理程序不是结转 exec,除了可能 SIG_IGN for SIGCHLD.

*特别是,通过在 exec.