c++ - 打开 FIFO(命名管道)卡住 - 忽略 SIGINT、SIGTERM

标签 c++ linux signals named-pipes freeze

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

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

现在我的应用程序卡住了,等待管道打开。因为进程是相互通信的 fork 兄弟,所以我无法确定进程 A 在进程 B 之前设置了管道的末端 - 即我看不到使用 O_NONBLOCK 的方法(至少没有连续尝试设置它)。

从管道读取时,信号似乎可以正常中止。只是管道的开口被锁住了。

有什么想法吗?

最佳答案

我改为采用非阻塞方法。我忙着等待(短暂的 sleep ),直到管道建立或发出终止信号。

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

设置一个额外的通信 channel 只是为了同步关闭(加上正确处理)是非常困难的。

关于c++ - 打开 FIFO(命名管道)卡住 - 忽略 SIGINT、SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527056/

相关文章:

c - Longjmp 超出信号处理程序?

c++ - 程序收到信号 SIGSEGV,Segmentation fault

c++ - Windows Core Audio Api 在捕获设备上获取所有支持的格式

c++ - If 条件检查 Cout

linux - 在 bash 中比较 *nix 时间戳的最佳方法

linux - 检查已安装的软件包,如果没有找到则安装

c - 信号 "auto-block"(当执行进入处理程序函数时)是否会阻止另一个此类信号传递到另一个线程?

c++ - 如何捕获 I/O 异常(确切地说是 I/O,不是 std::exception)

c++ - 如何在 Qt 中分层独立的小部件?

php - 将图像或文件上传到生产环境时,带有单引号的文件名会出现内部 500 错误