【问题标题】:Broken Pipe error断管错误
【发布时间】:2011-03-29 00:40:00
【问题描述】:

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

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

感谢您的帮助 亚历山大

【问题讨论】:

  • 您没有提供足够的信息来诊断问题。一个好的起点是演示问题的最小可编译代码段。
  • 我正在使用两个线程,一个读取数据包并写入缓冲区...第二个线程从缓冲区读取这些数据包并写入套接字。
  • 我想知道你为什么要使用线程?通常程序只是读写,使用非阻塞 IO 和轮询或选择。线程会工作,但会为比赛和奇怪的错误带来很多机会......
  • 我正在研究多线程实时环境,其中每个线程都是一个硬件线程。所以我别无选择。

标签: c sockets freebsd pipe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    EPIPE 可能被设置为错误代码,和/或SIGPIPE 在您尝试写入已关闭的文件描述符时引发(取决于标志)。您的连接的远程端点很可能已经关闭,并且您没有检查关闭/EOF 事件(通常在poll/selecting 时通过读取事件返回,或者从 @ 的返回值为零987654325@/recv)。

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2016-01-11
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多