パスワードを忘れた? アカウント作成
362533 journal

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見ろ!」ってことですね。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...