PIPEの概要
- プロセス間通信で使用できる単方向のデータチャンネル
- man page へのリンク→ PIPE
- 名前付きPIPEを用いると、PIPEの識別にファイル名が用いれて便利
Blocking/NonBlocking
- PIPE への Write/Read の挙動は Blocking と NonBlocking の 選択が行える
- PIPE を open() する際の引数で
O_NONBLOCK
を指定すると NonBlocking になる- man page へのリンク→ OPEN
- PIPE を open() する際の引数で
Blocking の特徴
- NonBlocking に比べて扱いが容易
- open(), read(), write() の関数内から、条件が整うまで戻らない。(Blocking)
NonBlocking の特徴
- open(), read(), write() の関数内で即時に実行が行えない場合には、関数から即時に抜けてくる。(NonBlocking)
- 即時に実行が行えない時の処理を自前で実装することが可能
Read 側での Blocking/NonBlocking での挙動の違い
Write 側での Blocking/NonBlocking での挙動の違い
- Write 側は、相手がCloseした場合に SYGPIPEを受ける
- 終了するにしても継続するにしても、SYGPIPE時の処理を書くのが良さそう
NonBlocking でのセオリー
- 名前つきPIPEを作成後、Read側が先にPIPEをopen()する。
- Read側がPIPEをopen()したのを検知した後、Write側でPIPEをopen()させるのが好ましい。
- この検知させる仕組みで凝りすぎてもバグの元。。
- Read側がPIPEをopen()したのを検知した後、Write側でPIPEをopen()させるのが好ましい。
疑問からの調査
Read側の継続性
- NonBlocking の場合に Write 側が close() した後に再度 open()した場合には、Read側も 再度open()する必要があるか?
- 不要だった、Read側は open()し直さなくても読み取れる
- CentOS7で検証した
- 不要だった、Read側は open()し直さなくても読み取れる