0

ハングしている ksh スクリプトを呼び出す Java アプリがあります。バックエンドを見ると、スクリプトの書き込みプロセスSTDOUTがいっぱいでブロックされていることがわかります。STDERR空であるはずで、私のJavaコードは最初にそれを読んでいます。デバッグすると、Java アプリが入力ストリームの読み取りでハングSTDERRし、STDOUT にさらに書き込みを試みるスクリプト プロセスがブロックされることが示されます。私STDERRは秒(後STDOUT)に書き込まれていると思うので、入力が表示されるまで待機します(書き込みがオンになっているため、入力を受け取ることができませんSTDOUT)。

このアプリは、1 つを除いて、複数の Linux ボックス (すべて同一の OS とカーネル) で正常に動作します。各入力ストリームの読み取りを別々のスレッドに配置すると、この 1 つのボックスの問題が解決されます。STDERRLinux のデフォルトは非バッファリングであり、その入力は通常すぐに書き込まれることを知っています。したがってSTDERR、このボックスでバッファリングに設定されている可能性があると考えています。その価値をどのように/どこで見つけることができますか?

4

1 に答える 1

1

単一のスレッドで stderr と stdout を読み取ることは、適切ケースではありません。正しい解決策は、2 つの別個のスレッドを使用することです。それ以外は、失敗するのを待っている単なる競合状態です。

ノンバッファリングとノンブロッキングを混同しているのではないでしょうか? stderr をバッファリングしないようにしても、(stderr または sdout でブロックすることによって) プログラムがいつでもハングする可能性がなくなるわけではありません。

于 2013-08-05T18:29:26.100 に答える