2010-08-12 42 views
1

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

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

感谢您的帮助 亚历山大

+0

您尚未提供足够的信息来诊断问题。一个好的起点是能够证明问题的最小可编译代码片段。 – 2010-08-12 15:57:18

+0

我使用两个线程读取数据包并写入缓冲区......第二个线程从缓冲区读取这些数据包并写入套接字。 – alexander 2010-08-12 16:25:04

+1

我不知道你为什么使用线程?通常程序只是读取和写入,使用非阻塞IO和轮询或选择。线程将*工作*,但为种族和怪异的错误带来如此多的机会... – 2010-08-12 22:03:19

回答

3

EPIPE可以被设置为一个错误代码,和/或SIGPIPE上调(取决于标志),当您试图写入已关闭的文件描述符。连接的远程端点很可能已关闭,并且您尚未检查close/EOF事件(通常在poll/select ing或read/recv的返回值为零时通过读取事件返回)。

3

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