可能重复:
Why is writing a closed TCP socket worse than reading one?
为什么错误的返回值不足? 通过测试EPIPE的返回值,我能在信号处理程序中做些什么呢?
答案 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>