

Socket通信(TCP/Blocking I/O)において、以下のようなコードでreadを実行した際に  
EAGAINが発生した場合、その原因としてどのようなケースが考えられるのでしょうか？

[code]

    while ((c = read(fileno(din), buf, bufsize)) > 0) {
        // something to do
    }
    
[/code]

EAGAINは主にNon-Blocking I/O時に読み込むデータが無い場合等で発生する認識でしたが、  
以下のmanの記載では、Blocking I/O時にもSO_RCVTIMEOが設定されている且つreadが  
タイムアウトした場合も発生するように読み取れます。  
<https://linuxjm.osdn.jp/html/LDP_man-pages/man7/socket.7.html>

上記記載の通り、Blocking I/OにおいてもEAGAINが発生するケースはあるのでしょうか。  
またあるとすれば、上記の他にどのようなケースが存在するのでしょうか。


CC BY-SA 4.0
2018-12-28T02:40:13.693
51569
2020-07-06T13:01:55.220
31608
question
linux c centos socket tcp
Socket通信(TCP/Blocking I/O)において、read(recv)実行時にEAGAINが発生するケースについて


質問に記載の2ケースを想定しておけばよいと思います。(socketの`read`に関する情報は、`recvmsg`のマニュアルを参照するのがよいと思います。そこには、質問に記載の2ケースが述べられています)

[Man page of RECV](https://linuxjm.osdn.jp/html/LDP_man-
pages/man2/recvmsg.2.html)

「エラー」節より引用

> **EAGAIN** または **EWOULDBLOCK**  
>  ソケットが非停止 (nonblocking) に設定されていて 受信操作が停止するような状況になったか、 受信に時間切れ (timeout)
> が設定されていて データを受信する前に時間切れになった。  
>  POSIX.1-2001 は、この場合にどちらのエラーを返すことも認めており、 これら 2 つの定数が同じ値を持つことも求めていない。  
>  したがって、移植性が必要なアプリケーションでは、両方の可能性を 確認すべきである。


CC BY-SA 4.0
2018-12-28T08:25:36.277
51580
2018-12-28T12:12:13.253
2018-12-28T12:12:13.253
3060
20098
51569
answer