SIGPIPE 如何影响命名管道中的作者?

Posted

技术标签:

【中文标题】SIGPIPE 如何影响命名管道中的作者?【英文标题】:How does SIGPIPE affect writer in named pipe? 【发布时间】:2014-07-09 21:40:38 【问题描述】:

我们需要将应用程序的标准输出重定向到我们的程序。而且我们不能更改应用程序。因此,我们无法在编写器中处理 SIGPIPE。我们不希望应用程序在程序崩溃时终止。未命名的管道无法工作。但是命名管道呢?我们在想,如果我们的程序崩溃了,我们可以重新启动它,并将它附加到命名管道。这有意义吗?

命名管道上的写入器是否会在 SIGPIPE 中被阻止?

【问题讨论】:

【参考方案1】:

当命名管道的读者离开时,作者将获得一个 SIGPIPE,就像未命名管道一样。该提议不会直接起作用。

有效的是有一个进程保持命名管道无限期地打开以供读取,但从不读取它。然后,您的不可靠进程也可以打开命名管道,从中读取,在必须时崩溃,并且新的化身可以重复该过程,所有这些都无需向写入进程发送 SIGPIPE。

请注意,(a) 您可能会丢失数据,因为您的阅读器已读取它但在处理之前崩溃了,并且 (b) 如果管道达到其容量,您的写入可能会在写入时被阻塞。

FIFO 的容量取决于系统;可能你没有遇到困难,因为它足够大。在 Linux 上,一个 FIFO 的容量是 64 KiB,例如,通过运行确定:

mkfifo fifo
sleep 1000 < fifo &  # Do-nothing 'reader' process
dd if=/dev/zero of=fifo bs=1k count=2048

并打断; dd 报告它写了 64 个 1 KiB 的块,因此 FIFO 大小为 64 KiB。但要小心;在其他系统上大小会有所不同——例如,Mac OS X 10.9.4 上的相同技术报告容量为 8 KiB。

但也许您应该考虑修复不可靠的进程以使其不会崩溃?

【讨论】:

请注意,一个简单的程序(我称之为pause)可能很有用:#include &lt;unistd.h&gt;int main(void) pause(); return(0); 。这几乎是终极无所事事程序; pause() 系统调用在未忽略的信号到达之前不会返回(即使这样,它也只会在存在捕获信号并返回而不是退出的信号处理程序时才返回)。我真的用pause &lt; fifo &amp; 等待FIFO,而不是sleep 1000

以上是关于SIGPIPE 如何影响命名管道中的作者?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免命名管道中的多个作者?

Windows中的命名管道

当作者来来去去时从命名管道重新读取

如何识别文件是不是是java中的命名管道

我的 C++ 程序如何等到对命名管道进行新的写入?

c中的命名管道