pipe(2),#|,#s
pipe(2)と#|(パイプデバイス)を簡単に比較すると,
- pipe(2): UNIX同様,親子プロセス間で通信できるシステムコール.
- #|: UNIXの名前付きパイプに相当し,ファイルにマッピングされる.mkfifoのようなシステムコールではなく,デバイスドライバとして提供され,名前空間を共有するプロセス間で通信できる.POSIXのパイプは単方向であるが,Plan9のパイプは双方向である.
パイプデバイスは,
bind #| dir
という使い方になり,成功するとdir/dataとdir/data1というファイルが作られる.dataとdata1はペアになっていて,dataにデータを書き込むとdata1から読み出すことができ,同様にdata1に書き込んだデータをdataから読み出すことができる.前述のcexecpipe関数でオープンしていたのは,まさにこのdataとdata1である.
この考えをさらに進めて,リモートの計算機ともパイプで通信できるようにする仕掛けが#s(srvデバイス)である.これ自体はファイル識別子をカーネルに教えるだけの仕組みだが,そのファイル識別子がリモートホストへのチャネルのときでも,ネットワーク透過に通信できる.分散OSっぽいねぇ.