2010-01-22 33 views
3

当我运行下面的管道:停止程序,如果在管道中的下一个进程被停止

cat my_large_file.txt | head | wc 

过程几乎立即停止。好。

,但是当我运行java程序

java MyProgramReadALargeFile my_large_file.txt | head | wc 

从“WC”的输出打印到stdout但Java程序仍在运行。它如何检测管道是否关闭?

感谢,

+0

显示如何编写Java程序 – ghostdog74

回答

1

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

搜索诸如“java posix signals”之类的东西会生成一些库,可能允许您将信号处理程序添加到Java代码中。

1

“头”关闭第10行后的数据流,所以这是正常的的Java仍在运行,而“头”和“厕所”完成。也许你可以在你的Java代码中测试System.out是否仍然打开,但我怀疑这是一种可靠的方法。它可能取决于管道的OS实现以及System.out的JVM实现(它真的关闭了流还是将它传递给了/ dev/null)。

(你试过cat'ing文件足够大和检查,如果“猫”过程中也不断“头”运行后完成?)

0

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

您可以查看'cat'的来源以查看它是否对输出流的状态进行任何检测。如果是这样的话,你必须在你的'MyProgramReadALargeFile'程序中放入类似的代码。否则,头部可能正在做一些喂料管道检测不到的过程。

如果该“猫”例如完成速度可疑,尝试做

cat my_large_file.txt > /dev/null 

,看看它一样快。