LoginSignup
0
1

More than 1 year has passed since last update.

PIPEでのBlockingとNon Blockingでの挙動の違い調査メモ

Last updated at Posted at 2022-07-13

PIPEの概要

  • プロセス間通信で使用できる単方向のデータチャンネル
    • PIPEには Write側 と Read側 がある
    • image.png
  • man page へのリンク→ PIPE
  • 名前付きPIPEを用いると、PIPEの識別にファイル名が用いれて便利

Blocking/NonBlocking

  • PIPE への Write/Read の挙動は Blocking と NonBlocking の 選択が行える
    • PIPE を open() する際の引数で O_NONBLOCK を指定すると NonBlocking になる
      • man page へのリンク→ OPEN

Blocking の特徴

  • NonBlocking に比べて扱いが容易
  • open(), read(), write() の関数内から、条件が整うまで戻らない。(Blocking)

NonBlocking の特徴

  • open(), read(), write() の関数内で即時に実行が行えない場合には、関数から即時に抜けてくる。(NonBlocking)
    • 即時に実行が行えない時の処理を自前で実装することが可能

Read 側での Blocking/NonBlocking での挙動の違い

image.png

Write 側での Blocking/NonBlocking での挙動の違い

image.png

  • Write 側は、相手がCloseした場合に SYGPIPEを受ける
    • 終了するにしても継続するにしても、SYGPIPE時の処理を書くのが良さそう

NonBlocking でのセオリー

  • 名前つきPIPEを作成後、Read側が先にPIPEをopen()する。
    • Read側がPIPEをopen()したのを検知した後、Write側でPIPEをopen()させるのが好ましい。
      • この検知させる仕組みで凝りすぎてもバグの元。。

疑問からの調査

Read側の継続性

  • NonBlocking の場合に Write 側が close() した後に再度 open()した場合には、Read側も 再度open()する必要があるか?
    • 不要だった、Read側は open()し直さなくても読み取れる
      • CentOS7で検証した
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1