3

当我运行以下管道时:

cat my_large_file.txt | head | wc

该过程几乎立即停止。好的。

但是当我运行我的java程序时

java MyProgramReadALargeFile my_large_file.txt | head | wc

'wc' 的输出被打印到stdout但 java 程序仍在运行。它如何检测到管道已关闭?

谢谢,

4

3 回答 3

1

'head' 在前 10 行之后关闭流,因此在 'head' 和 'wc' 完成时 Java 仍在运行是正常的。如果 System.out 仍然打开,也许您可​​以在您的 Java 代码中进行测试,但我怀疑这是一种可靠的方法。它可能取决于管道的操作系统实现和 System.out 的 JVM 实现(它是真的关闭流还是只是将它传递给 /dev/null)。

(您是否尝试过对一个足够大的文件进行 cat 处理并检查在 'head' 完成后 'cat' 进程是否也继续运行?)

于 2010-01-22T13:56:02.647 回答
1

大多数 UNIX 实用程序都会注意SIGPIPE,当接收到它时,它表明进程正在写入的管道流在另一端没有任何监听,因此无需继续工作。

搜索“java posix 信号”之类的内容会产生一些库,这些库可能允许您将信号处理程序添加到 Java 代码中。

于 2010-02-23T15:58:25.520 回答
0

我怀疑它从 java prog 的角度关闭 System.out。它可能会重定向到/dev/null,但head 更容易停止监听java 程序的输出流,即exit()。

您可以查看“cat”的来源,看看它是否对输出流的状态进行了任何检测。如果是这种情况,您必须将类似的代码放入您的“MyProgramReadALargeFile”程序中。否则,head 可能正在做一些馈送管道的过程无法检测到的事情。

如果“猫”示例完成的速度可疑,请尝试执行

cat my_large_file.txt > /dev/null

看看它是否一样快。

于 2010-01-22T14:44:06.460 回答