質問: read(fileno(din), buf, bufsize)) > 0) { // something to do } ``` EAGAINは主にNon-Blocking I/O時に読み込むデータが無い場合等で発生する認識でしたが、 以下のmanの記載では、Blocking I/O時にもSO_RCVTIMEOが設定されている且つreadが タイムアウトした場合も発生するように読み取れます。 上記記載の通り、Blocking I/OにおいてもEAGAINが発生するケースはあるのでしょうか。 またあるとすれば、上記の他にどのようなケースが存在するのでしょうか。
回答: 質問に記載の2ケースを想定しておけばよいと思います。(socketの`read`に関する情報は、`recvmsg`のマニュアルを参照するのがよいと思います。そこには、質問に記載の2ケースが述べられています) Man page of RECV 「エラー」節より引用 > > **EAGAIN** または **EWOULDBLOCK** > > ソケットが非停止 (nonblocking) に設定されていて 受信操作が停止するような状況になったか、 受信に時間切れ (timeout) が設定されていて データを受信する前に時間切れになった。 > > POSIX.1-2001 は、この場合にどちらのエラーを返すことも認めており、 これら 2 つの定数が同じ値を持つことも求めていない。 > > したがって、移植性が必要なアプリケーションでは、両方の可能性を 確認すべきである。 > > >