witchの日記: (ROBO)(URLメモ) X-9 select()を利用したFIFOからの読み込みでの注意点
日記 by
witch
ひとつ前の日記に書いた「select()でFIFOから読み込んだ後、一度ファイルディスクリプタを閉じる」件、ちゃんとマニュアル(man select_tut)に載ってました。
select_tut(select tutorial)日本語訳 (JM Project)
末尾のほうにある「SELECT の掟」に
7. で示した場合を除き、 read(), recv(), write(), send() などの関数は、エラーでなければ決して 1 より小さい値を返さない。例えば、他端が死んでいるパイプに対して read() を行うと、0 が返る (end-of-file エラーと同じ) が、 しかし 0 が返るのは一度だけである (それ以降に read や write を行った場合 -1 が返る)。これらの関数が 0 か -1 を返したら、そのディスクリプタを select に二度と渡してはならない。上記の例では、そのディスクリプタをただちにクローズし、そこには -1 をセットして、それが集合に含まれ続けるのを許さないようにしている。
とあります。
今回の場合、コマンドラインから
echo "command strings" > FIFO
として制御コマンドを投入しているので、echo 終了時に他端が死んでしまうのでした。
そして、その後始末をせずに select() を呼ぶのですぐに戻ってきてしまうと…。
「man見ろ!」ってことですね。
(ROBO)(URLメモ) X-9 select()を利用したFIFOからの読み込みでの注意点 More ログイン