在Broken管道上发送行为

时间:2010-07-05 20:57:29

标签: c pipe

在编写一个简单的服务器 - 客户端应用程序时,我想到了这个问题。当有人试图写入损坏的管道时,将生成一个SIGPIPE。假设我在代码中处理信号。

现在写入调用返回什么错误 - EPIPE或EINTR(因为它被信号中断)。我尝试了一个示例程序,我似乎总是得到EPIPE。这是保证的行为还是可能是两个错误值中的任何一个?

3 个答案:

答案 0 :(得分:2)

POSIX说应该返回EPIPE并发送SIGPIPE:

  • 对于write()s或pwrite()s,管道或FIFO不能通过任何进程打开,或只打开一端。
  • 用于写入()s到不再连接或关闭以进行写入的套接字。

您可以查看POSIX标准here

答案 1 :(得分:1)

write(2)调用在出错时返回-1,因此我猜你问的是errno(3)的价值。

如果处理阻止忽略信号,您将获得EPIPE。否则,默认情况下会终止该过程,请参阅signal(7)

答案 2 :(得分:0)

通常,“被信号中断”(EINTR)指的是非常荒谬的Unix System V信号处理,如果您的进程在接收(和处理)信号期间 ANY 系统调用可能会失败系统调用。这需要用do ... while (ret==-1 && errno==EINTR);或类似的方式包装每个系统调用。虽然POSIX仍允许这种或良好的(“BSD”)行为,但像GNU / Linux这样的理智系统默认具有BSD行为。您始终可以通过使用正确的参数调用sigaction来获取BSD行为,或者甚至为您执行包装函数。

因此,EINTR与写入错误导致的SIGPIPE无关。