如果没有结束调用close()或崩溃,会导致自发EPIPE错误的原因是什么?

Hon*_*gli 6 unix sockets posix ipc

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

  1. A向B发送请求.这有效.A现在开始阅读B的回复.
  2. B向A发送回复.相应的write()调用返回EPIPE错误,结果B关闭()套接字.然而,A并没有关闭()的插座,也没有崩溃.
  3. A的read()调用返回0,表示文件结束.A认为B过早地关闭了连接.

用户还报告了此行为的变化,例如:

  1. A向B发送请求.这部分工作,但在发送整个请求之前A的write()调用返回EPIPE,结果是一个close()套接字.但是B没有关闭()套接字,也没有崩溃.
  2. B读取部分请求然后突然获得EOF.

问题是我无法在本地重现此行为.我试过OS X和Linux.用户使用各种系统,主要是OS X和Linux.

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

  • 双close()错误(在同一文件描述符上调用close()两次):可能不会导致EBADF错误,但我还没有看到它们.
  • 增加最大文件描述符限制.一位用户报告说这对他有用,其余用户报告说没有.

还有什么可能导致这样的行为?我肯定知道A和B都不会过早地关闭()套接字,并且我肯定地知道它们都没有崩溃,因为A和B都能够报告错误.好像内核突然决定出于某种原因从插座拔出插头.

use*_*268 4

也许您可以尝试 strace,如下所述:http ://modperlbook.org/html/6-9-1-Detecting-Aborted-Connections.html

我认为您的问题与此处描述的问题有关:http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not -可靠的

不幸的是,我自己也遇到了类似的问题,但无法按照给定的建议解决它。然而,也许 SO_LINGER 的东西适合你。

  • 不完全是我正在寻找的答案,但您链接到的 TCP 页面信息非常丰富!现在Archive.org已经下架了:http://ia700609.us.archive.org/22/items/TheUltimateSo_lingerPageOrWhyIsMyTcpNotReliable/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable .html (2认同)