fc2ブログ

シグナルを考慮する

シグナルについて - それっぽいメモ

シグナル良くわかってない。UNIXプログラミングのちゃんとした本読ま ないとだめだな...。けどそれ系の本って高くて買えない。
シグナル/プロセス・・・ @2005.09.14合わせて読む

Linuxへのポートの参考

Windows→Linuxへの移行時の注意点

ぱっと見よくまとまってそうだけど、どうだろ。同期系について後で読む(2008.3.26)。
select()がシグナルで中断されるというの以外は今や問題なし。

シグナル/プロセス・・・

UNIX系のプログラムプロセスとかシグナルとか簡単とか思ってたら。いろいろ落とし穴があるらしい。
一度、memologueさんのサイトは読んでおいたほうが良さそう。

名前付きパイプ(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)