1
我使用命名管道在分叉进程之间进行通信。每个流程处理SIGINT
和SIGTERM
,然后关闭管道的末端并清理。在FIFO上打开(命名管道)冻结 - 忽略SIGINT,SIGTERM
如果当我创建一个进程的信号发生权,则该过程挂起,同时试图打开管道(因为另一端已经关闭它 - 或者另一端可能无法再初始化)。
现在我的应用程序卡住等待打开管道。由于这些进程是分叉的彼此通信的兄弟姐妹,我不能确定进程A在进程B之前是否已经建立了它的管道末端 - 也就是说,我没有看到使用O_NONBLOCK
的方式(至少没有连续尝试设置它)。
从管道读取数据时,信号似乎无法正常工作。这只是锁起来的管子的开口。
任何想法?
在分叉和打开管道之间,拒绝在终止时关闭?也许甚至可以告诉另一端你终止了,并干净地关闭? – Yakk
我想主要的问题是每个进程自己处理信号,因此可能会在另一个进程处理它之前关闭连接。我可以检查是否在分叉之前发出信号,但是这仍然留下一个小小的时间窗口,信号可能会上升,我仍然叉开。我想我只能尝试使用''O_NONBLOCK''而等待它打开(或一个信号)... – urbanhusky
你可以不打开父分支前的两个前叉分叉前?然后让每个进程关闭fork后不需要的描述符。 –