FC2ブログ

名前付きパイプ(FIFO)について

  1. 名前付きパイプへの書き込み、読み込みをするプロセスが1つずつある。
  2. 読み込み側では、書き込みをselect()待っている
  3. 書き込み側で名前付きパイプをopenして書き込む
  4. 読み込み側では、書き込まれたタイミングでselect()が返ってくる
  5. 書き込み側で名前付きパイプを閉じる
  6. この時、読み込み側のselect()が常に待ちなしで帰ってきて0バイトのread()が正常に行われる。

正常な動作なんだけど、書き込み側で名前付きパイプがclose()された後もselect()で次にopen()、write()されるのを待ちたい場合に不都合・・・。
解決策は、書き込み側で名前付きパイプがclose()されたら、読み込み側でEOFがread()されるので、読み込み側でも一旦名前付きパイプをclose()、再度open()して、書き込み側が次のopen()、write()されるのを待つ。
BSDでは、poll()を使えば一旦close()しなくても良さそう・・・

  struct pollfd poll;
  poll.events = POLLIN|POLLINIGNEOF;
  if (poll(poll_list , 1, -1) < 0) {
    exit(1);
  }

->NAB - Re: kern/76525: select() hangs on EOF from named pipe (FIFO)
スポンサーサイト



この記事へのトラックバックURL

http://memolet.blog22.fc2.com/tb.php/18-71c1951e

この記事へのトラックバック

この記事へのコメント