私は、実行中のJavaプログラムとコンソール間の名前付きパイプベースのプロセス間通信を実現しようとしています。Javaプログラム(Test.java)の内容は以下のとおりです。
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception {
// starts pipe server
InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader bufReader = new BufferedReader(isReader);
boolean shutdown = false;
while(!shutdown) {
String inputStr = bufReader.readLine();
if(inputStr != null) {
System.out.println("PONG: "+inputStr);
}
Thread.sleep(1000);
}
}
}
プログラムを使用してコンパイルされました:
javac Test.java
名前付きパイプが作成されました:
mkfifo testing
そして、プログラムは、パイプSTDOUTの消費者として実行されました:
java Test < testing
次に、コンソールを使用して、私はパイプのSTDINへのpingを送信しています:
echo PING > testing
これは、出力するJavaプログラムによって捕獲されています。
PONG: PING
今、奇妙な問題は:Javaプログラムが、走っている時はいつでも、メッセージがパイプに送られるまで、そのプロセスが使用して追跡不可能であるPSゾーかさえには/ proc /を。
これはUbuntuの(仕事用のコンピュータ)とRHEL(運用サーバー)OSの両方を再生します。誰もがそれがなぜ起こるか任意のアイデアを持っていますか?
それはあなたのJavaプログラムとは何の関係もありませんが、あなたからそれを開始しているシェルと、および名前付きパイプの動作と。
以下のようなコマンドにprogram <file
シェルする最初、fork()
別のプロセス、次いでによってリダイレクトを実行open()
するfile
、そして最後に。execve()
program
場合はfile
名前付きパイプ/ FIFOで、open()
それはそのもう一方の端までブロックしますINGのは、あまりにも開いています。そこからJavaプログラムがあなたまで開始されていない、あなたが観察している行動、open()
FIFOのもう一方の端を。
あなたは簡単にそのブロックされません読み取り/書き込みモードでFIFOを開くことで回避することができますが、読者は、パイプの終わりを閉じたときの手段が検出する能力をあきらめること-あなたのプログラムを取得することはありませんEOF
でその標準入力:
mkfifo testing
java Test 0<>testing