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

时间:2018-06-02 16:08:01

标签: c++ c linux network-programming epoll

所以......我非常困惑为什么我的基于epoll的tcp服务器随机挂起了epoll_wait,然后在我终止SIGINT时向一些连接发送一个空数组。

事实证明,我的软件中有一个随机的错误导致我写了以下内容:

class CustomNavController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent;
    }
}

虽然这是不正确的,但我当然不会期望调用大小为0的写操作会使整个事情挂起。

为什么会发生这种情况,我该如何预防呢?调用长度参数为零的写只是UB,我应该始终确保大小为> 0?

1 个答案:

答案 0 :(得分:1)

以相反的顺序提出问题,

  

使用长度参数0调用write只是UB而我应该始终确保大小为> 0?

According to POSIX

  

如果nbyte为零且文件不是常规文件,则结果为   未指定的。

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

  

为什么会发生这种情况,我该如何预防呢?

防止它的最可靠方法是避免对常规文件以外的任何内容进行零长度写入。可能是您的使用模式中存在特定的某些内容会触发您观察到的不需要的行为,但我们无法评估您未向我们提供的代码,即使我们可以,但行为仍然未指定。我们知道或确定的任何内容可能会在未来的内核或标准库版本中发生变化而不会发出警告。