在我的多线程 Linux 服务器应用程序中,一个线程永远卡在 send
函数中,我认为它应该是非阻塞的。代码如下所示:
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
应该立即返回。我的代码/假设有什么问题?感谢您提出任何建议。
最佳答案
对不起,这是我的错误:发送
没有阻塞,而是一次又一次地输入,即使它表明套接字还没有准备好接受更多数据。
关于Linux 发送 MSG_DONTWAIT block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45448103/