5

Java プログラムから呼び出される XML を検証する Perl プログラムがあります。標準エラーに書き込めず、印刷場所にぶら下がっています。

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;
}

事前に助けに感謝します。

ありがとう、マシュー・リジュ

4

5 に答える 5

7

getErrorStream はエラー ストリームを読み取らず、そのハンドルを取得するだけです。これはパイプであるため、実際に読み取らないと、いっぱいになり、Perl プログラムが強制的にブロックされます。

次のようなものが必要です。

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

理想的には、デッドロックを回避するために、Java では、STDERR と STDOUT を読み取るために別のスレッドを生成する必要があると思います。なんらかの理由で Java で STDERR から読み取ることがないため、STDERR への書き込み時に Perl がブロックしているように思えます。

于 2008-12-10T14:58:16.880 に答える
4

考慮すべき追加の要因は、パイプ処理されたプロセスで発生するバッファリングです。

デフォルトでは、プロセス間パイプを作成するシェルによって維持される約 30 行程度のバッファーがあるため、Perl アプリが十分なデータを作成していない場合、データは Java アプリケーションにまだ送信されていません。処理する。

于 2008-12-10T07:27:19.707 に答える
4

このスレッドが問題の原因である可能性があります:

Perl スクリプトの先頭に 3 行を追加します。

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

言及されたスレッドの問題は、「Perl が出力をバッファリングする方法」に関連していました。

ただし、ここでは、Adrian Pronkがコメントで「Java が出力を読み取らないため、Perl がハングしている」と述べています。

于 2008-12-10T07:27:35.870 に答える
0
STDOUT->autoflush(1);
STDERR->autoflush(1);

これが私が必要とした情報です!いくつかのPerlスクリプトを実行しているJavaアプリがあり、それが終了した後にのみ出力を取得します。追加することautoflush(1)で、すぐにわかります。

ところで、私は読むための別々のスレッドを持っています、STDERRそしてSTDOUTそれは行く方法です。

ありがとう。

于 2009-11-24T18:20:41.827 に答える