检查 write()/send() 是否可以无阻塞地处理整个缓冲区,否则失败(无部分写入)

2024-01-05

我正在使用 SOCK_SEQPACKET 连接,确保通过单个 write()/send() 调用发送整个缓冲区对我来说至关重要。我还使用设备驱动程序进行操作,该驱动程序旨在通过单个调用处理完整的数据块。同时我想处理 write()/send() 由于缓冲区溢出而阻塞的情况,即我想得到当前实现是否遇到瓶颈的反馈。我正在使用 glibc,Linux 2.6。

我需要实现一个接受缓冲区的方法,它要么完全发送缓冲区,要么指示由于阻塞而失败(即系统缓冲区溢出)。

看起来使用 send(..., MSG_DONTWAIT)/fcntl(..., O_NONBLOCK) 不是一个解决方案,因为它们在报告 EWOULDBLOCK/EAGAIN 之前接受部分写入。有没有办法检查传出缓冲区是否有足够的空间,或者是否有专用的写入完成或失败方法?

或者,是否可以通过其他方式检测阻塞?例如,计时器+信号似乎是一个选项,但我不喜欢为每次写入设置它的想法。

先感谢您。


实验表明,我的设置(glibc 2.11.1,内核 2.6.32-29)中没有发生部分发送,并且 send(...MSG_DONTWAIT) 返回了 EAGAIN/EWOULDBLOCK,正如 AF_UNIX+SOL_SEQPACKET 套接字所预期的那样。

不确定行为是否具有普遍性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 write()/send() 是否可以无阻塞地处理整个缓冲区,否则失败(无部分写入) 的相关文章

随机推荐