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