我们需要将应用程序的stdout重定向到我们的程序。而我们无法改变应用程序。所以,我们无法在编写器中处理SIGPIPE。当我们的程序崩溃时,我们不希望应用程序终止。未命名的管道无法工作。但命名管道怎么样?我们正在考虑,如果我们的程序崩溃,我们可以重新启动它,并将它附加到命名管道。它有意义吗?
命名管道上的编写器是否会在SIGPIPE中被阻止?
答案 0 :(得分: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。
但也许您应该考虑修复不可靠的过程,以免它崩溃?