管道损坏时的发送行为

发布于 2024-09-08 10:11:52 字数 177 浏览 3 评论 0原文

在编写一个简单的服务器客户端应用程序时,我想到了这个问题。当有人尝试写入损坏的管道时,会生成 SIGPIPE。假设我在代码中处理信号。

现在 write 调用返回什么错误 - EPIPE 或 EINTR (因为它被信号中断)。我尝试了一个示例程序,似乎总是得到 EPIPE。这是有保证的行为还是可能是两个错误值中的任何一个?

While writing a simple server-client application, this question came in my mind. When someone tries to write to a broken pipe, a SIGPIPE would be generated. Let's say I handle the signal in my code.

Now what error does the write call returns - EPIPE or EINTR ( as it was interrupted by a signal). I tried with a sample program and I seem to be getting EPIPE always. Is this a guaranteed behavior or it could be any of the two error values?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

dawn曙光 2024-09-15 10:11:52

POSIX 规定应返回 EPIPE 并发送 SIGPIPE:

  • 对于管道或 FIFO 的 write() 或 pwrite() 未打开供任何进程读取,或仅一端打开。
  • 用于 write() 到不再连接或关闭以进行写入的套接字。

您可以在此处查看 POSIX 标准

POSIX says that EPIPE should be returned and SIGPIPE sent:

  • For write()s or pwrite()s to pipes or FIFOs not open for reading by any process, or with only one end open.
  • For write()s to sockets that are no longer connected or shut down for writing.

You can have a look at the POSIX standard here

黑白记忆 2024-09-15 10:11:52

write(2) 调用返回 - 1 错误,所以我猜您是在询问 errno 的值(3)

如果您处理阻止忽略信号,您将获得EPIPE。否则进程默认终止,参见 signal(7)

The write(2) call returns -1 on error, so I guess you are asking about the value of errno(3).

You'll get EPIPE if you handle, block, or ignore the signal. Otherwise the process is terminated by default, see signal(7).

笑,眼淚并存 2024-09-15 10:11:52

一般来说,“被信号中断”(EINTR)是指完全荒谬的 Unix System V 信号处理,如果您的进程在系统调用期间接收(并处理)信号,任何系统调用都可能失败。这需要用 do ... while (ret==-1 && errno==EINTR); 或类似的方法包装每个系统调用。虽然 POSIX 仍然允许这种行为或良好的(“BSD”)行为,但像 GNU/Linux 这样的健全系统默认情况下具有 BSD 行为。您始终可以通过使用正确的参数调用 sigaction 来获取 BSD 行为,甚至可以创建一个包装函数来为您执行此操作。

因此,EINTR 与写入错误引起的 SIGPIPE 无关。

In general, "interrupted by a signal" (EINTR) refers to the utterly ridiculous Unix System V signal handling, whereby ANY system call could fail if your process received (and handled) a signal during the system call. This required wrapping every system call with do ... while (ret==-1 && errno==EINTR); or similar. While POSIX still allows either this or the good ("BSD") behavior, sane systems like GNU/Linux have the BSD behavior by default. You can always obtain the BSD behavior by calling sigaction with the right arguments, or even make a wrapper function to do so for you.

As such, EINTR is unrelated to the SIGPIPE caused by write errors.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文