在我的C++应用程序中,当打开文件描述符,可以读取数据并关闭fd时,一个线程使用poll()函数得到通知。当数据可用时,将读取数据并将其传递到其他线程进行处理和回复。实际上,另一方面,客户端在打开的套接字上等待同步答复。
当一个fd不再可用时,我将尽最大努力通知其他线程,但目前不同步所有线程中设置的文件描述符。
问题是这段代码:
while(bytes < len && d->ok) {
w = write(fd, buf + bytes, len - bytes);
d->ok = (w >= 0);
if(d->ok)
bytes += w;
}
关闭fd会使整个应用程序崩溃。
预期的行为:write返回负数,但没有崩溃。
我读过一些发送SIGPIPE的线程,这就是应用程序崩溃的原因,但是我发现它没有明确记录在文档中
人写
我想到的选择:
但是,我想,如果在循环中处于write()时fd被另一端关闭,我会崩溃,而不是write()产生简单的负结果
我究竟做错了什么?
感谢您的任何建议
请您参考如下方法:
I / O功能可能导致SIGPIPE,数据写入速度越快,可能性越大。不幸的是,您的应用程序崩溃了,而您没有机会处理该错误,这确实会造成很大的混乱。为了解决这个问题,您只需要将SIGPIPE的信号处理程序设置为SIG_IGN-然后write()将改为使用errno = EPIPE(断开的管道)返回-1,并且您可以关闭边描述符并正确进行清理。