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