是否有一个进程在终止前不发送 EOF 以及如何创建它?

Kar*_*ter 1 linux process stdout stderr

我怀疑进程在分别用SIGINT和杀死时不发送 EOF SIGKILL。可能是这种情况吗(或者所有进程是否总是在被任何信号终止后发送 EOF)stdoutstderr如果是,我如何模仿这样的过程,以便我可以在 Java 单元测试中使用它(仅需要在 Linux 上运行初学者)?

英文维基百科的 EOF 文章对此并不清楚,德国人说 EOF“可能”被发送。

我知道这可能是一个 XY 问题,并且在调试 Java 代码时寻求支持可以更快地修复问题,但我也有兴趣获得这个问题的答案。我还知道 Java 9 中的进程处理得到了改进,但我还无法使用。

我正在使用 Ubuntu 17.04 和 Linux 4.10。

PSk*_*cik 5

AnEOF并不是真正的“发送”。这是一个事件,您的进程调用read系统调用并返回0,对于管道来说,当管道的另一端已关闭时(由拥有该管道的所有进程关闭,如果文件描述符已被复制),就会发生这种情况。

内核将始终在终止进程时关闭所有文件描述符。没有办法解决这个问题(甚至 SIGKILL 进程的文件描述符也会被关闭)。如果这些文件描述符中的任何一个是对管道文件描述符写入端的最后一个引用,则read相应读取端的下一个文件描述符将返回 0,这stdio将解释为EOF.