所以....我很困惑为什么我的基于 epoll 的 tcp 服务器随机挂起 epoll_wait,然后在我用 SIGINT 终止时向某些连接发送一个空数组。
事实证明,我的软件中有一个随机错误,导致我编写了以下内容:
write(server_socket_fd, payload, 0)
虽然这是不正确的,但我当然不认为调用大小为 0 的 write 会挂起整个过程。
为什么会发生这种行为,我该如何预防?使用长度参数零调用 write 只是 UB,我应该始终确保大小 > 0 吗?
最佳答案
以相反的顺序回答你的问题,
Is calling write with the length argument zero just UB and I should always make sure the size is > 0 ?
If
nbyte
is zero and the file is not a regular file, the results are unspecified.
write()
的 Linux 手册页说了同样的话。 “未指定”与标准语中的“未定义”不同,但如果您真的关心会发生什么,那么避免未指定的行为也是明智的。
Why is this behavior happening and how do I prevent it ?
防止它的最可靠方法是避免对除常规文件以外的任何内容进行零长度写入。可能是您的使用模式特定的某些东西触发了您观察到的不良行为,但我们无法评估您未向我们展示的代码,即使我们可以评估,该行为仍然是未指定的。我们知道或确定的任何东西都可能在未来某个版本的内核或标准库中毫无预警地发生变化。
关于c++ - 将空数据写入非阻塞套接字会导致 epoll_wait 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50658765/