Unix 在不调用close()或崩溃的情况下,什么会导致自发的EPIPE错误?
我有一个由两个进程(我们称它们为A和B)组成的应用程序,它们通过Unix域套接字相互连接。大多数情况下,它工作正常,但一些用户报告了以下行为:Unix 在不调用close()或崩溃的情况下,什么会导致自发的EPIPE错误?,unix,sockets,ipc,posix,Unix,Sockets,Ipc,Posix,我有一个由两个进程(我们称它们为A和B)组成的应用程序,它们通过Unix域套接字相互连接。大多数情况下,它工作正常,但一些用户报告了以下行为: A向B发送一个请求。这是有效的。A现在开始阅读B的回复 B向a发送回复。相应的write()调用返回一个eppe错误,结果B()关闭套接字。但是,A()没有关闭套接字,也没有崩溃 A的read()调用返回0,表示文件结束。A认为B过早地关闭了连接 用户还报告了这种行为的变化,例如: A向B发送一个请求。这部分起作用,但在发送整个请求之前,A的write(
- Double close()bug(close()在同一个文件描述符上被调用两次):可能不会导致EBADF错误,但我还没有看到它们
- 增加最大文件描述符限制。一个用户报告说这对他有效,其他用户报告说没有
- 可能有人打电话给 套接字端点
- 如果任何一方可以分叉并执行 子进程,确保 (执行时关闭)标志设置在 套接字文件描述符(如果没有) 意愿它被继承 小孩否则,子进程 可能(意外或其他)是 操纵套接字连接
RST
。最好的追踪方法当然是(或其。)也许您可以尝试strace,如中所述:
我假设您的问题与此处描述的问题有关:
不幸的是,我自己也有一个问题,但无法通过给出的建议来解决。不过,也许这件事对你有用。谢谢,但这两种情况都不适用于我的计划。。。。在UNIX域套接字上?这是当地唯一的协议哦。。。哎呀,我完全错过了。谢谢。事实证明,服务器的文件描述符与EPOLLET标志一起添加到epoll队列中,这似乎是错误的。这与我所寻找的答案不完全相同,但您链接到的TCP页面信息量很大!它现在已经被Archive.org关闭了,但它仍然存在: