据我了解,SIGPIPE
只能作为以下结果发生write()
,它可以(并且确实)返回 -1 并设置errno
to EPIPE
...那么为什么我们会有额外的信号开销呢?每次我使用管道时我都会忽略SIGPIPE
并且从未因此感到任何疼痛,我是否错过了什么?
我不买以前接受的答案。SIGPIPE
恰好在以下时间生成write
失败了EPIPE
,而不是事先 - 事实上,这是一种安全的避免方法SIGPIPE
不改变全局信号配置的方法是暂时屏蔽它pthread_sigmask
,执行write
,然后执行sigtimedwait
(零超时)消耗任何待处理的SIGPIPE
再次取消屏蔽之前发出信号(发送到调用线程,而不是进程)。
我相信这个理由SIGPIPE
存在要简单得多:为连续读取输入、以某种方式转换它并写入输出的纯“过滤”程序建立合理的默认行为。没有SIGPIPE
,除非这些程序显式处理写入错误并立即退出(无论如何,这可能不是所有写入错误的理想行为),否则它们将继续运行,直到耗尽输入,即使它们的输出管道已关闭。当然你可以复制的行为SIGPIPE
通过明确检查EPIPE
并退出,但整个目的SIGPIPE
就是当程序员偷懒的时候默认实现这个行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)