在我的 C++ 应用程序中,一个线程使用 poll() 函数在文件描述符打开、数据可供读取和 fd 关闭时得到通知。当数据可用时,它被读取并交付给其他线程进行处理和回复。事实上,另一方面,客户端在打开的套接字上等待同步回复。当一个 fd 不再可用时,我尽最大努力通知其他线程,但没有(目前)在所有线程之间同步文件描述符集。问题是这段代码:
while(bytes < len && d->ok) {
w = write(fd, buf + bytes, len - bytes);
d->ok = (w >= 0);
if(d->ok)
bytes += w;
}
一旦 fd 关闭,整个应用程序就会崩溃。
预期行为:写入返回负数但没有崩溃。我已经阅读了一些发送 SIGPIPE 的线程,这就是应用程序崩溃的原因,但我发现它没有明确记录在
男人写
我想到的选项:
- 同步文件描述符集,这样一旦 poll() 通知 fd 关闭,其他线程就不再使用它
- 使用 send() 而不是 write。
但是,我想,如果 fd 在我处于 write() while 循环时被另一端关闭,我会得到一个崩溃而不是 write() 的简单否定结果
我究竟做错了什么?感谢您的任何建议