打开FIFO(命名管道)冻结-忽略SIGINT, SIGTERM

open on FIFO (named pipe) freezes - ignores SIGINT, SIGTERM

本文关键字:忽略 SIGINT SIGTERM 冻结 FIFO 管道 打开      更新时间:2023-10-16

我使用命名管道在分支进程之间进行通信。每个进程处理SIGINTSIGTERM,然后关闭其管道末端并进行清理。

如果信号发生在我fork一个进程的时候,那么这个进程在试图打开管道的时候挂起(因为另一端已经关闭了它——或者另一端可能不再初始化)。

现在我的应用程序卡在等待管道打开。因为进程是相互通信的分支兄弟进程,我不能确定进程A在进程B之前设置了管道的末端-也就是说,我看不到使用O_NONBLOCK的方法(至少在没有连续尝试设置它的情况下)。

从管道中读取时,信号似乎很好地中止了它。这只是管道的开口锁住了。

任何想法?

我选择了一种非阻塞的方法。我忙等待(有短暂的睡眠),直到管道建立或终止信号。

阅读和写作是相似的。如果没有可用的数据(读取0字节),则等待并重试。如果发生错误,我处理它,如果没有信号,再试一次(因为这需要在后台运行,而不是撕毁应用程序)。

设置一个额外的通信通道来同步关机(加上正确处理)是相当困难的。