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
はすぐに返すべきであると信じていたコードは次のようになります。私のコード/仮定が間違っていますか?ご意見ありがとうございます。