Linux 发送 MSG_DONTWAIT block ?

标签 linux send glibc nonblocking

在我的多线程 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/

相关文章:

c - GCC 正在生成充满零的二进制文件

linux - 安装 debian 后 windows 7 无法启动

linux - 这是如何使用 poll(2) 的 posix 队列?

sql - 为什么显示的 sed 命令行显示 "extra characters after command"错误?

php - 发送电子邮件 PHP 脚本无法接收

php - 如何在 Laravel 5 .env 文件中设置多个发送地址?

C - 通过单个套接字发送多条消息 - 在关闭套接字之前数据不会传输

c - 从头开始为 Linux 构建 Glibc-2.11.1 时出错

c - 使用 glibc 依赖项从 chroot 动态加载库

c++ - 交叉编译 VisualGDB/C++ Cubietruck => Linkererror