在我的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的线程,这就是应用程序崩溃的原因,但是我发现它没有明确记录在文档中
人写
我想到的选择:
  • 同步文件描述符集,以便当poll()通知fd关闭时,不再有其他线程使用它了。
  • 使用send()代替write。

  • 但是,我想,如果在循环中处于write()时fd被另一端关闭,我会崩溃,而不是write()产生简单的负结果
    我究竟做错了什么?
    感谢您的任何建议

    请您参考如下方法:

    I / O功能可能导致SIGPIPE,数据写入速度越快,可能性越大。不幸的是,您的应用程序崩溃了,而您没有机会处理该错误,这确实会造成很大的混乱。为了解决这个问题,您只需要将SIGPIPE的信号处理程序设置为SIG_IGN-然后write()将改为使用errno = EPIPE(断开的管道)返回-1,并且您可以关闭边描述符并正确进行清理。


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!