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

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

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

英语维基百科 EOF 文章不清楚这一点,德语表示“可能”发送 EOF。

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

我正在使用 Ubuntu 17.04 和 Linux 4.10。

答案1

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

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

答案2

EOF如果发送几个字符,可能没有问题。因此,您可以将 Java 程序与EOF在 Java 程序退出后输出的 shell 代码一起运行。

( javaprog ; echo -n $'\4' ) | program_waiting_for_eof

不过,需要对信号处理进行一些配置,以确保 Java 进程被终止,但后续代码仍然执行。如果这是适合您的方法(您可以通过直接从另一个终端终止 Java 进程来进行测试kill $PID),那么如果您需要的话,我可以提供额外的信息来执行此操作。

相关内容