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

标签 c++ c linux network-programming epoll

所以....我很困惑为什么我的基于 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 手册页说了同样的话。 “未指定”与标准语中的“未定义”不同,但如果您真的关心会发生什么,那么避免未指定的行为也是明智的。

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

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

关于c++ - 将空数据写入非阻塞套接字会导致 epoll_wait 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50658765/

相关文章:

c++ - 当函数属于类时未解析的重载函数类型

c - 从所有数组元素打印字符串

核心转储到 char ** 指针上

linux - 使用批处理文件从 Windows 计算机在远程 Linux 计算机上运行自定义命令

c++ - cldoc 在模板部分特化时崩溃

java - 为什么 java 是平台无关的,而 c/c++ 不是?

c - 查找数组中出现次数最多的数字

linux - 使用大量文件构建 rpm

linux - 为什么 rwxrwxrwx 文件不允许 chmod 777?

C++11 实验函数