Javaで名前付きパイプを使う

名前付きパイプというものがあると言うことは聞いていたけれど、使ったことは無いのでちょっと使ってみました。
環境はMac OS(Mavericks)です。

名前付きパイプの説明はこちら。簡単に言うとファイルみたいに読み書きできるパイプで、プロセス間通信に使うことが多いようです。お互いのプロセスで名前付きパイプを開き、片方でwriteすると、もう片方でreadすることができます。
一見ファイルですが、実際にディスクに読み書きするわけでは無いので省エネということですね。

Macで名前付きパイプを作成する場合は、mkfifoコマンドを使います。次のようにします。

$ mkfifo named_pipe

lsすると、普通のファイルのように作成されます。

prw-r--r--  1 kitamura  staff  0  2  6 14:46 named_pipe

今回は、echoコマンドで名前付きパイプに書き込み、それをJava側で読み込んでみます。

書き込み側は次の通りです。

$ echo "ふがふがふが子\nほげほげほげ太" > named_pipe

これを実行すると、Java側で読み込むまでブロックします。

Java側は次のようにします。

File file = new File("/Users/kitamura/Documents/tmp/named_pipe");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}

Macでは読み込み側、書き込み側両方がopenするまで、openでブロックしました。JavaではFileInputStreamのnewでブロックします。書き込む場合は、FileOutputStreamのnewでブロックします。

Linuxでは、Macと挙動が違い、Readをopenしなくてもバッファがいっぱいになるまで書き込みができます。

OSによって挙動の違いが気になりますが、気軽にプロセス間通信できそうですね。

 

No Comments

Post a Comment

コメントを投稿するには、下の計算の答えを入力する必要があります。答えは半角数字で入力してください。 * Time limit is exhausted. Please reload the CAPTCHA.