【发布时间】:2020-10-27 14:05:03
【问题描述】:
在我的 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() 的简单否定结果
我做错了什么? 感谢您的任何建议
【问题讨论】:
标签: linux multithreading crash write