问题
SIGPIPE
是否可以在写入pipe()
FD时禁用信号 ( ) 的提升,而无需安装我自己的信号处理程序或全局禁用/屏蔽信号?
背景
我正在研究一个偶尔创建管道的小型库,以及fork()
一个等待来自父级消息的临时子/虚拟进程。当子进程收到来自父进程的消息时,它会(故意)死亡。
问题
子进程在我无法控制的情况下运行来自另一个(第三方)库的代码,该库很容易崩溃,所以我不能总是确定子进程在我write()
进入管道之前是活跃的。
这导致我有时会尝试write()
在子进程结束时已经死/关闭的管道,并且它会SIGPIPE
在父进程中引发 a。我在其他客户将使用的库中,因此我的库必须尽可能独立且对调用应用程序透明。安装自定义信号处理程序可能会破坏客户的代码。
工作至今
我已经通过使用解决了套接字的这个问题setsockopt(..., MSG_NOSIGNAL)
,但是我找不到任何与管道等效的功能。我已经考虑过临时安装一个信号处理程序来捕获SIGPIPE
,但我没有看到任何方法可以将其范围限制在我的库中的调用函数而不是整个过程(而且它不是原子的)。
我在 SO 上也发现了一个类似的问题,它问的是同样的问题,但不幸的是,使用poll()
/select()
不会是原子的,并且子进程在我的select()
和write()
调用之间死亡的可能性很小(但可能)。
问题(redux)
有没有办法完成我在这里尝试的事情,或者在不触发将生成的行为的情况下原子地检查并写入管道SIGPIPE
?此外,是否有可能实现这一点并知道子进程是否崩溃?知道它是否崩溃可以让我为提供“崩溃”库的供应商构建一个案例,并让他们知道它失败的频率。