当我运行以下管道时:
cat my_large_file.txt | head | wc
该过程几乎立即停止。好的。
但是当我运行我的java程序时
java MyProgramReadALargeFile my_large_file.txt | head | wc
'wc' 的输出被打印到stdout
但 java 程序仍在运行。它如何检测到管道已关闭?
谢谢,
'head' 在前 10 行之后关闭流,因此在 'head' 和 'wc' 完成时 Java 仍在运行是正常的。如果 System.out 仍然打开,也许您可以在您的 Java 代码中进行测试,但我怀疑这是一种可靠的方法。它可能取决于管道的操作系统实现和 System.out 的 JVM 实现(它是真的关闭流还是只是将它传递给 /dev/null)。
(您是否尝试过对一个足够大的文件进行 cat 处理并检查在 'head' 完成后 'cat' 进程是否也继续运行?)
大多数 UNIX 实用程序都会注意SIGPIPE,当接收到它时,它表明进程正在写入的管道流在另一端没有任何监听,因此无需继续工作。
搜索“java posix 信号”之类的内容会产生一些库,这些库可能允许您将信号处理程序添加到 Java 代码中。
我怀疑它从 java prog 的角度关闭 System.out。它可能会重定向到/dev/null,但head 更容易停止监听java 程序的输出流,即exit()。
您可以查看“cat”的来源,看看它是否对输出流的状态进行了任何检测。如果是这种情况,您必须将类似的代码放入您的“MyProgramReadALargeFile”程序中。否则,head 可能正在做一些馈送管道的过程无法检测到的事情。
如果“猫”示例完成的速度可疑,请尝试执行
cat my_large_file.txt > /dev/null
看看它是否一样快。