0

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

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

4

1 回答 1

1

用单线程读取 stderr 和 stdout 是一个主意,例如。正确的解决方案是使用两个单独的线程。其他任何事情都只是等待失败的竞争条件。

也许您将非缓冲与非阻塞混淆了?使 stderr 非缓冲不会消除您的程序在任何时间点挂起的可能性(通过阻塞 stderr 或 sdout)。

于 2013-08-05T18:29:26.100 回答