5

我们有一个 Perl 程序来验证从 Java 程序调用的 XML。它无法写入标准错误并挂在打印位置。

Perl 正在写入 STDERR,而 java 程序正在使用 getErrorStream() 函数读取 STDERR。但是 Perl 程序正在挂起写入 STDERR。我怀疑 Java 函数完全阻塞了 STDERR 流,而 Perl 正在等待这个流被释放。

Perl 中有没有办法克服这种阻塞并强制写入标准错误?由于 Java 仅进行读取,因此 API 不应按照 java doc 锁定 STDERR 流。

Perl 代码片段是:

sub print_error
{
    print STDERR shift;
}

Java代码片段是:

while ( getErrorStream() != null )
{
    SOP errorMessage;
}

提前感谢帮助。

谢谢, 马修 Liju

4

5 回答 5

7

getErrorStream 不读取错误流,它只是获取它的句柄。因为它是一个管道,如果你从未真正读过它,它会填满并强制 Perl 程序阻塞。

你需要类似的东西:

Inputstream errors = getErrorStream();
while (errors.read(buffer) > 0) {
    SOP buffer;
}
于 2008-12-10T07:40:45.607 回答
4

另一个需要考虑的因素是管道进程发生的缓冲。

默认情况下,大约有一个 30 行的缓冲区,由创建进程间管道的 shell 维护,因此如果 Perl 应用程序没有创建足够的数据,它还不会被发送到 Java 应用程序过程。

于 2008-12-10T07:27:19.707 回答
4

可能是这个线程有可能导致您的问题:

在 Perl 脚本的顶部添加 3 行:

use IO::Handle;
STDOUT->autoflush(1);
STDERR->autoflush(1);

上述线程中的问题与“Perl 缓冲其输出的方式”有关。

然而在这里,Adrian Pronk在评论中提到“Perl 挂起,因为 Java 从不读取它的输出”。

于 2008-12-10T07:27:35.870 回答
4

理想情况下,我认为为了避免死锁,在 Java 中您需要生成单独的线程来读取 STDERR 和 STDOUT。听起来 Perl 在写入 STDERR 时会阻塞,因为出于某种原因,您永远不会在 Java 中读取它。

于 2008-12-10T14:58:16.880 回答
0
STDOUT->autoflush(1);
STDERR->autoflush(1);

这是我需要的信息!我有一个运行一些 Perl 脚本的 Java 应用程序,我只会在它完成后得到输出。通过添加,autoflush(1)我马上就明白了。

顺便说一句,我确实有单独的线程来阅读STDERRSTDOUT,这就是要走的路。

谢谢。

于 2009-11-24T18:20:41.827 回答