我们最近在C(Unix环境)中就信号处理程序进行了讨论。
有人提到
(f)printf() is certainly thread-safe but not signal-handler safe.
上述陈述是什么意思? (f)printf()的哪个方面使信号处理程序不安全?是因为它访问了全局的stdout和stdin,因此函数不可重入?
或者我还缺少其他一些方面吗?
答案 0 :(得分:4)
实际上,在信号处理程序中直接执行是合法的。相反,通常必须设置一些标志或触发器来执行信号处理上下文之外的实际工作。在处理信号时,您可以调用的唯一功能是“异步信号安全”,这将在下面详细介绍:What constitutes asynchronous-safeness
答案 1 :(得分:2)
如此处所述:http://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html#Nonreentrancy
如果函数使用并修改了您提供的对象,那么它就是 可能不可重入;如果他们使用两个电话可能会干扰 相同的对象。
对象是stdout
。当信号到达(f)printf()
的中间并且如果您在处理程序中使用(f)printf
时,两个数据都可能在同一个流stdout
上运行时被破坏。在这种情况下,可重入是根本原因。即使你只是在信号处理程序中使用流,两个信号处理程序也会干扰。