Unix SIGPIPE如何影响命名管道中的writer?

Unix SIGPIPE如何影响命名管道中的writer?,unix,pipe,named-pipes,sigpipe,Unix,Pipe,Named Pipes,Sigpipe,我们需要将应用程序的stdout重定向到我们的程序。我们不能更改应用程序。因此,我们无法在writer中处理SIGPIPE。我们不希望应用程序在程序崩溃时终止。此时,未命名管道无法工作。但是命名管道呢?我们在想,如果我们的程序崩溃,我们可以重新启动它,并将其附加到命名管道。这有什么意义吗 命名管道上的写入程序是否会被SIGPIPE阻塞 当命名管道的读取器离开时,编写器将得到一个SIGPIPE,就像未命名管道一样。那项建议不会直接起作用 工作原理是让一个进程无限期地打开命名管道进行读取,但从不读取

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


命名管道上的写入程序是否会被SIGPIPE阻塞

当命名管道的读取器离开时,编写器将得到一个SIGPIPE,就像未命名管道一样。那项建议不会直接起作用

工作原理是让一个进程无限期地打开命名管道进行读取,但从不读取它。然后,您的不可靠进程还可以打开命名管道,从中读取,在必须时崩溃,并且新的化身可以重复该进程,而无需将SIGPIPE发送到writer进程

请注意:(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
mkfifo-fifo
sleep 1000
点击中断
dd
报告它写入了64个1kib的块,因此FIFO大小为64kib。但要谨慎,;在其他系统上,大小会有所不同-例如,Mac OS X 10.9.4上的相同技术报告容量为8 KiB

但是也许你应该考虑修复不可靠的进程,这样它就不会崩溃了?< /P>注意一个简单的程序(我称之为代码>暂停/代码>)是有用的:<代码>包含了和<代码> int main(空隙){PAUSESE(),返回(0);}。这几乎是一个终极的无所事事的计划;

pause()
系统调用在未识别的信号到达之前不会返回(即使如此,只有在有信号处理程序捕获信号并返回而不是退出时才会返回)。我确实使用了
pause
来等待fifo,而不是
sleep 1000