我们需要将应用程序的标准输出重定向到我们的程序。而且我们不能更改应用程序。因此,我们无法在编写器中处理 SIGPIPE。我们不希望应用程序在程序崩溃时终止。未命名的管道无法工作。但是命名管道呢?我们在想,如果我们的程序崩溃了,我们可以重新启动它,并将它附加到命名管道。这有什么意义吗?
命名管道上的作者会在 SIGPIPE 中被阻止吗?
我们需要将应用程序的标准输出重定向到我们的程序。而且我们不能更改应用程序。因此,我们无法在编写器中处理 SIGPIPE。我们不希望应用程序在程序崩溃时终止。未命名的管道无法工作。但是命名管道呢?我们在想,如果我们的程序崩溃了,我们可以重新启动它,并将它附加到命名管道。这有什么意义吗?
命名管道上的作者会在 SIGPIPE 中被阻止吗?
当命名管道的读者离开时,作者将获得一个 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。
但也许您应该考虑修复不可靠的过程,使其不会崩溃?