2015-05-29 123 views
1

我使用命名管道在分叉进程之间进行通信。每个流程处理SIGINTSIGTERM,然后关闭管道的末端并清理。在FIFO上打开(命名管道)冻结 - 忽略SIGINT,SIGTERM

如果当我创建一个进程的信号发生权,则该过程挂起,同时试图打开管道(因为另一端已经关闭它 - 或者另一端可能无法再初始化)。

现在我的应用程序卡住等待打开管道。由于这些进程是分叉的彼此通信的兄弟姐妹,我不能确定进程A在进程B之前是否已经建立了它的管道末端 - 也就是说,我没有看到使用O_NONBLOCK的方式(至少没有连续尝试设置它)。

从管道读取数据时,信号似乎无法正常工作。这只是锁起来的管子的开口。

任何想法?

+0

在分叉和打开管道之间,拒绝在终止时关闭?也许甚至可以告诉另一端你终止了,并干净地关闭? – Yakk

+0

我想主要的问题是每个进程自己处理信号,因此可能会在另一个进程处理它之前关闭连接。我可以检查是否在分叉之前发出信号,但是这仍然留下一个小小的时间窗口,信号可能会上升,我仍然叉开。我想我只能尝试使用''O_NONBLOCK''而等待它打开(或一个信号)... – urbanhusky

+1

你可以不打开父分支前的两个前叉分叉前?然后让每个进程关闭fork后不需要的描述符。 –

回答

0

我反而采用了非阻塞的方法。我忙着等待(短暂的睡眠),直到管道建立或信号终止。

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

这本来是非常难以建立一个额外的通信信道只是同步关机(加处理是正确的)。