【问题标题】:What's the purpose of send(2) receiving a SIGPIPE? [duplicate]send(2) 接收 SIGPIPE 的目的是什么? [复制]
【发布时间】:2010-11-09 18:45:49
【问题描述】:

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

为什么错误的返回值还不够?
通过测试 EPIPE 的返回值我无法在信号处理程序中做什么?

【问题讨论】:

  • stackoverflow.com/questions/2216374/… (接受的答案有点下降,但很好地解释了最初的目的。当您明确处理 TCP 套接字时,通常的做法是将 SIGPIPE 设置为 SIG_IGN 并处理写入/发送返回 -1)

标签: c linux sockets


【解决方案1】:

在过去,几乎每个信号都会导致 Unix 程序终止。因为通过管道进行进程间通信是 Unix 的基础,SIGPIPE 旨在终止未处理 write(2)/read(2) 错误的程序。

假设您有两个通过管道进行通信的进程。如果其中一个死了,管道的一端将不再活动。 SIGPIPE 也打算杀死其他进程。

例如,考虑:

cat myfile | grep find_something

如果cat 在读取文件的过程中被杀死,grep 根本没有什么可做的,并且被SIGPIPE 信号杀死。如果没有发送信号并且grep 没有检查read 的返回值,grep 将在某些方面出现异常。

【讨论】:

    【解决方案2】:

    与许多其他事情一样,我的猜测是,这只是某人做出的设计选择,最终将其纳入 POSIX 标准并一直保留至今。有人可能认为尝试通过关闭的套接字发送数据是一件坏事™,并且您的程序需要立即得到通知,而且由于没有人检查错误代码,有什么比发送信号更好的通知方式呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 2011-09-13
      • 2011-06-28
      • 2020-05-25
      • 2013-01-19
      相关资源
      最近更新 更多