Unix/Linux には 名前付きパイプというものがあります。
Unixドメインソケットの説明で「名前付きパイプに類似した機能を備え〜」と書いてあって 今まで何となく「パイプに名前付けらるんだな」くらいにと思ってましたが 実際に使ったことがなかったので、試してみます。
使用するのは mkfifo というコマンド。
$ mkfifo /tmp/namedpipe
これで作成完了。
$ ls -l /tmp/namedpipe prw-rw-r-- 1 xxxxx xxxxx 0 Oct 22 22:06 /tmp/namedpipe
なんかできてますし 権限の先頭が "p" になってます。
機能はなんとなく想像できますね。
動作を確認するために、 まず別のコンソールで この名前付きパイプを tail します。
$ tail -f /tmp/namedpipe
待機状態になりました。
tail しているコンソールとは別のコンソールで 名前付きパイプに向かってリダイレクトしてみます。
$ echo test1 > /tmp/namedpipe $ echo test2 > /tmp/namedpipe
tail しているコンソール側に 出力されていきます。
$ tail -f /tmp/namedpipe
test1
test2
なるほど、直接つながっていなくても 名前付きパイプを通してデータが連携できてますね。
rm コマンドで削除できます。
$ rm /tmp/namedpipe
ここまでだと、ほぼ通常のファイルを使っても同じようなことができますが 受け側で tail していない状態でリダイレクトすると 通常のファイルとは違う動きになりました。
$ echo test3 > /tmp/namedpipe
受け側が 名前付きパイプを tail していないとこの状態で リダイレクトすると リダイレクトした側が待機状態になります。
受け側で 名前付きパイプに tail や cat などすると リダイレクト側の待機が解除されます。
$ cat /tmp/namedpipe
test3
便利に使えるケースはありそうですね。