在编写一个简单的服务器 - 客户端应用程序时,我想到了这个问题。当有人试图写入损坏的管道时,将生成一个SIGPIPE。假设我在代码中处理信号。
现在写入调用返回什么错误 - EPIPE或EINTR(因为它被信号中断)。我尝试了一个示例程序,我似乎总是得到EPIPE。这是保证的行为还是可能是两个错误值中的任何一个?
答案 0 :(得分:2)
POSIX说应该返回EPIPE并发送SIGPIPE:
您可以查看POSIX标准here
答案 1 :(得分:1)
答案 2 :(得分:0)
通常,“被信号中断”(EINTR)指的是非常荒谬的Unix System V信号处理,如果您的进程在接收(和处理)信号期间 ANY 系统调用可能会失败系统调用。这需要用do ... while (ret==-1 && errno==EINTR);
或类似的方式包装每个系统调用。虽然POSIX仍允许这种或良好的(“BSD”)行为,但像GNU / Linux这样的理智系统默认具有BSD行为。您始终可以通过使用正确的参数调用sigaction
来获取BSD行为,或者甚至为您执行包装函数。
因此,EINTR与写入错误导致的SIGPIPE无关。