何かがパイプSTDINに供給されるまでのプロセスを実行すると、パイプSTDOUTへのフィードは追跡不可能であること

ルシアンガブリエルポペスク:

私は、実行中の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の両方を再生します。誰もがそれがなぜ起こるか任意のアイデアを持っていますか?

MOSV:

それはあなたのJavaプログラムとは何の関係もありませんが、あなたからそれを開始しているシェルと、および名前付きパイプの動作と。

以下のようなコマンドにprogram <fileシェルする最初、fork()別のプロセス、次いでによってリダイレクトを実行open()するfile、そして最後にexecve()program

場合はfile名前付きパイプ/ FIFOで、open()それはそのもう一方の端までブロックしますINGのは、あまりにも開いています。そこからJavaプログラムがあなたまで開始されていない、あなたが観察している行動、open()FIFOのもう一方の端を。

あなたは簡単にそのブロックされません読み取り/書き込みモードでFIFOを開くことで回避することができますが、読者は、パイプの終わりを閉じたときの手段が検出する能力をあきらめること-あなたのプログラムを取得することはありませんEOFでその標準入力:

mkfifo testing
java Test 0<>testing

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=336282&siteId=1