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

时间:2015-05-29 10:18:06

标签: c++ linux signals named-pipes freeze

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

如果在我分叉进程时信号正好发生,那么进程在尝试打开管道时会挂起(因为另一端已经关闭它 - 或者另一端可能不再被初始化)。

现在我的应用程序一直在等待管道打开。因为进程是彼此通信的分叉兄弟,我无法确定进程A是否在进程B之前设置了它的管道末端 - 即我没有看到使用O_NONBLOCK的方法(不是至少没有不断尝试设置它。)

从管道读取时,信号似乎中止了。它只是管道的开口锁定了。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我改为使用非阻塞方法。我忙着等待(短暂的睡眠)直到管道建立或终止信号。

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

为了同步关机(加上正确的处理),设置一个额外的通信通道会非常困难。