如何判断STDERR是否在linux机箱上缓冲?

时间:2013-08-05 17:05:42

标签: java linux unix buffer pipe

我有一个java应用程序,它调用挂起的ksh脚本。后端的外观显示脚本对STDOUT的写入过程已满并被阻止。 STDERR应该是空的,我的java代码首先读取它。调试显示java应用程序挂起读取STDERR输入流,这反过来导致脚本进程尝试向STDOUT写入更多内容以阻止。我认为STDERR正被写入第二个(STDOUT之后),所以它只是等到它看到输入(并且由于写入卡在STDOUT上而无法接收输入)。 / p>

这个应用程序适用于多个Linux机箱(所有相同的操作系统和内核),除了一个。将每个输入流读入单独的线程可以解决此问题的问题。我知道STDERR的linux默认值是非缓冲的,并且输入通常会立即写入。所以我认为可以将STDERR设置为在此框中缓冲。我如何/在哪里找到它的价值?

1 个答案:

答案 0 :(得分:1)

使用单个线程读取stderr和stdout是一个错误的想法,例如。 正确的解决方案是使用两个单独的线程。其他任何事情只是一场等待失败的竞争状态。

也许你对非阻塞的非缓冲感到困惑?使stderr非缓冲不会消除程序在任何时间点挂起的可能性(通过阻塞stderr或sdout)。