【なまえつきぱいぷ】

名前付きパイプ とは?

最終更新:
💡 名前を目印に、プロセス同士がデータを流す通路

名前を使って接続できるプロセス間通信の仕組み。LinuxなどのFIFOはファイルシステム上のパスを持ち、データ自体はカーネル内を流れる。Windowsにも名前付きパイプがあるが、名前空間や通信方式は異なる。

📌 このページのポイント
LinuxのFIFO:名前で開くデータの通路 /tmp/mypipe 書き手 プロセスA 読み手 プロセスB バイト列 h e l l o 名前は目印。データはカーネル内を流れる 端末B:書き込み echo hello > /tmp/mypipe 端末A:読み取り cat /tmp/mypipe mkfifo /tmp/mypipe で作る例 通常ファイルのように内容を保存しない 待機・終了は、開き方と相手の状態による
一方向のバイト列の例で、各文字を見やすく区切った図形はメッセージ境界ではない。図内の端末コマンドは行を分けて表示。相手待ち・満杯時の待機やEOFは状態により、名前が残ってもデータの永続保存や全員配信にはならない。Windowsの仕様は本文で分けて説明。
ひよこ ひよこ
パイプの | と、名前付きパイプは何が違うの?
ペンギン先生 ペンギン先生
Linuxでは、名前付きパイプはFIFOという特殊ファイルのパスで開けるよ。名前のないパイプは読み書きの記述子を共有して使う。|でつないだコマンドが必ず親子同士になるわけではなく、シェルがそれぞれへ接続を渡す。FIFOなら、別に起動したプロセスもアクセス権があれば名前で接続できるんだ。
ひよこ ひよこ
ファイルなら、データがディスクに保存される?
ペンギン先生 ペンギン先生
LinuxのFIFOでは保存されないよ。ファイルシステム上の項目は名前の目印で、データはカーネル内のパイプを流れる。ls -lでは種類がpと表示される。バイト列の通路なので、メッセージの区切りや複数の読み手への全員配信が自動で付くわけではないんだ。
ひよこ ひよこ
簡単な例はある?
ペンギン先生 ペンギン先生
自分が管理できる場所の例として、mkfifo /tmp/mypipeで作る。端末Aでcat /tmp/mypipe、端末Bでecho hello > /tmp/mypipeを実行すれば、Aへhelloが届くよ。Bが書き込み側を閉じ、ほかの書き手もいなければAはEOFで終了する。後でFIFOの名前を削除して片付けるんだ。
ひよこ ひよこ
相手がまだいないと、ずっと待つの?
ペンギン先生 ペンギン先生
通常のブロッキングで開く例では、読み側と書き側がそろうまで待つ。読み込み時に空ならデータを待ち、書き込み時に満杯なら空きを待つ。ただしO_NONBLOCKなどでは待たない動作もある。読み手がいなくなった書き込みはSIGPIPEなどの扱いが必要で、必ず届けられる保証はないよ。
ひよこ ひよこ
Windowsでも使えるの?
ペンギン先生 ペンギン先生
使えるよ。ローカルの名前の例は \\.\pipe\mypipe。Windowsではサーバーとクライアントが接続し、一方向・双方向やバイト型・メッセージ型などを選べる。LinuxのFIFOと同じファイル操作だと思わず、アクセス権や使うAPIを確認するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「名前付きパイプ」って出てきたら「名前で接続する、プロセス間のデータの通路」と思えばだいたいOK!
📖 おまけ:英語の意味
「Named Pipe」 = 名前付きパイプ
💬 Namedは名前付き。LinuxのFIFOではファイルシステム上の名前が接続の目印になる。名前が残ることと、流したデータが保存されることは別だよ。

参考資料

← 用語集にもどる