将空数据写入非阻塞套接字会导致 epoll_wait 挂起

Writing empty data to a non-blocking socket results in epoll_wait hanging

所以....我很困惑为什么我的基于 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 ?

According to POSIX

If nbyte is zero and the file is not a regular file, the results are unspecified.

write() 的 Linux 手册页说了同样的话。 "Unspecified" 与标准语中的 "undefined" 不同,但如果您真的关心会发生什么,那么避免未指定的行为也是明智的。

Why is this behavior happening and how do I prevent it ?

防止它的最可靠方法是避免对除常规文件以外的任何内容进行零长度写入。可能是您的使用模式特定的某些东西触发了您观察到的不良行为,但我们无法评估您未向我们展示的代码,即使我们可以评估,该行为仍然是未指定的。在内核或标准库的某些未来版本中,我们知道或确定的任何内容都可能在没有警告的情况下发生变化。