名前付きパイプというものがあると言うことは聞いていたけれど、使ったことは無いのでちょっと使ってみました。
環境は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