Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在不调用close()或崩溃的情况下,什么会导致自发的EPIPE错误?_Unix_Sockets_Ipc_Posix - Fatal编程技术网

Unix 在不调用close()或崩溃的情况下,什么会导致自发的EPIPE错误?

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(

我有一个由两个进程(我们称它们为A和B)组成的应用程序,它们通过Unix域套接字相互连接。大多数情况下,它工作正常,但一些用户报告了以下行为:

  • A向B发送一个请求。这是有效的。A现在开始阅读B的回复
  • B向a发送回复。相应的write()调用返回一个eppe错误,结果B()关闭套接字。但是,A()没有关闭套接字,也没有崩溃
  • A的read()调用返回0,表示文件结束。A认为B过早地关闭了连接
  • 用户还报告了这种行为的变化,例如:

  • A向B发送一个请求。这部分起作用,但在发送整个请求之前,A的write()调用返回EPIPE,因此关闭()套接字。但是B没有关闭()套接字,也没有崩溃
  • B读取一个部分请求,然后突然得到一个EOF
  • 问题是我根本无法在本地重现这种行为。我试过OSX和Linux。用户在各种系统上,主要是OSX和Linux

    我已经尝试和考虑过的事情:

    • Double close()bug(close()在同一个文件描述符上被调用两次):可能不会导致EBADF错误,但我还没有看到它们
    • 增加最大文件描述符限制。一个用户报告说这对他有效,其他用户报告说没有
    还有什么可能导致这样的行为?我肯定地知道A和B都没有过早地关闭套接字,也肯定地知道它们都没有崩溃,因为A和B都能够报告错误。这就好像内核出于某种原因突然决定拔掉插座的插头。

    • 可能有人打电话给 套接字端点

    • 如果任何一方可以分叉并执行 子进程,确保 (执行时关闭)标志设置在 套接字文件描述符(如果没有) 意愿它被继承 小孩否则,子进程 可能(意外或其他)是 操纵套接字连接


    我也会检查中间没有隐藏的防火墙。路由上的中间转发节点可能发送
    RST
    。最好的追踪方法当然是(或其。)

    也许您可以尝试strace,如中所述:

    我假设您的问题与此处描述的问题有关:


    不幸的是,我自己也有一个问题,但无法通过给出的建议来解决。不过,也许这件事对你有用。

    谢谢,但这两种情况都不适用于我的计划。。。。在UNIX域套接字上?这是当地唯一的协议哦。。。哎呀,我完全错过了。谢谢。事实证明,服务器的文件描述符与EPOLLET标志一起添加到epoll队列中,这似乎是错误的。这与我所寻找的答案不完全相同,但您链接到的TCP页面信息量很大!它现在已经被Archive.org关闭了,但它仍然存在: