管道错误

时间:2010-08-12 15:54:42

标签: c sockets freebsd pipe

我在FTP实现中的已打开数据套接字上使用write()来发送文件。但在写完一些数据之后,它已经悬挂了一段时间;然后它返回Broken管道错误。任何帮助都将非常感谢。我的进程从一个buff读取数据包并写入套接字。我注意到带宽增加的问题。如果我增加了要处理的数据包数量,那么问题就出现了。我正在使用FreeBSD。

我使用两个线程,一个读取数据包并写入缓冲区......第二个线程从缓冲区读取这些数据包并写入套接字。

谢谢你的帮助 亚历山大

2 个答案:

答案 0 :(得分:4)

当检测到尝试将数据写入损坏的管道时,内核将

SIGPIPE发送到您的进程。例如,如果接收方在您写入时已关闭套接字,或者如果套接字意外地从另一个线程关闭等,则可能会发生这种情况。有很多可能的原因。大多数应用程序倾向于忽略此信号并根据“write”返回码处理错误,因为在SIGPIPE信号处理处理程序中没有任何合理的做法。基本上,将SIGPIPE处理程序设置为SIG_IGN以便忽略它并查看“write”系统调用中可能的返回代码列表并相应地处理它们。

答案 1 :(得分:3)

当您尝试写入已关闭的文件描述符时,

EPIPE可能被设置为错误代码,并且/或SIGPIPE引发(取决于标志)。您的连接的远程端点可能已关闭,并且您尚未检查close / EOF事件(通常在poll / select时通过读取事件返回,或返回值来自read / recv)的零。