发送(2)接收SIGPIPE的目的是什么?

时间:2010-11-09 18:45:49

标签: c linux sockets

  

可能重复:
  Why is writing a closed TCP socket worse than reading one?

为什么错误的返回值不足? 通过测试EPIPE的返回值,我能在信号处理程序中做些什么呢?

2 个答案:

答案 0 :(得分:1)

在过去,几乎所有信号都导致Unix程序终止。由于管道之间的进程间通信是Unix的基础,因此SIGPIPE旨在终止无法处理write(2) / read(2)错误的程序。

假设您有两个进程通过管道进行通信。如果其中一个死亡,管道的一端不再有效。 SIGPIPE也旨在杀死其他进程。

举个例子,考虑一下:

cat myfile | grep find_something

如果cat在读取文件的过程中被杀死,grep根本无法再做什么,并被SIGPIPE信号杀死。如果未发送任何信号且grep未检查read的返回值,则grep会以某种方式行为异常。

答案 1 :(得分:0)

与许多其他事情一样,我的猜测是,它只是一种设计选择,最终使其成为POSIX标准并一直保持到目前为止。有人可能认为尝试通过封闭的套接字发送数据是Bad Thing™并且您的程序需要立即通知,并且由于没有人检查错误代码,有什么更好的方式来通知您而不是发送信号? / p>