2017-08-01 8 views
1

私のマルチスレッドのLinuxサーバアプリケーションでは、スレッドは永遠にsendの機能でスタックされていますが、これはノンブロッキングでなければならないと思います。LinuxはMSG_DONTWAITブロックを送信しますか?

while(size) { 
    const ssize_t sent = send(unixSocketFD, data, size, MSG_NOSIGNAL | MSG_DONTWAIT); 
    if(sent > 0) { 
     size -= sent; 
     data += sent; 
    } else { 
     if(-1 == sent) { 
      if(EINTR == errno) { 
       continue; 
      } 
      if(EWOULDBLOCK == errno || EAGAIN == errno) { 
       return 0; // need to be called again later 
      } 
     } 
     return -1; // indicate error ... 
    } 
} 

...とスタックトレース:

(gdb) bt 
#0 0x00007ffff7bca9ff in __libc_send (fd=5, buf=0x7fffedd25880, n=87643, flags=16448) at ../sysdeps/unix/sysv/linux/x86_64/send.c:26 
#1 0x00000000004076cf in Output::sendBlock (this=0x7fffdc0a3190, unixSocketFD=5) at OutputBlock.cpp:24 
... 

私はフラグがMSG_DONTWAITが含まれている場合sendはすぐに返すべきであると信じていたコードは次のようになります。私のコード/仮定が間違っていますか?ご意見ありがとうございます。

答えて

0

申し訳ありませんが、これは私の間違いでした。sendはブロックされていませんでした。代わりに、ソケットがさらにデータを受け入れる準備ができていないことが示されたとしても、何度も繰り返されました。

関連する問題