我正在使用命名管道在分支进程之间进行通信。每个进程处理 SIGINT
和 SIGTERM
,然后关闭其管道末端并进行清理。
如果信号在我 fork 进程时恰好发生,则进程在尝试打开管道时挂起(因为另一端已经关闭它 - 或者另一端可能不再被初始化)。
现在我的应用程序卡住了,等待管道打开。因为进程是相互通信的 fork 兄弟,所以我无法确定进程 A 在进程 B 之前设置了管道的末端 - 即我看不到使用 O_NONBLOCK
的方法(至少没有连续尝试设置它)。
从管道读取时,信号似乎可以正常中止。只是管道的开口被锁住了。
有什么想法吗?
最佳答案
我改为采用非阻塞方法。我忙着等待(短暂的 sleep ),直到管道建立或发出终止信号。
阅读和写作的工作原理相似。如果没有可用数据(读取 0 个字节),那么我将等待并重试。如果出现错误,我会处理它,如果没有发出信号,请重试(因为这需要在后台运行而不是拆除应用程序)。
设置一个额外的通信 channel 只是为了同步关闭(加上正确处理)是非常困难的。
关于c++ - 打开 FIFO(命名管道)卡住 - 忽略 SIGINT、SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527056/