【发布时间】:2014-09-15 08:36:35
【问题描述】:
我们最近讨论了 C(Unix 环境)中的信号处理程序。
有人提到
(f)printf() is certainly thread-safe but not signal-handler safe.
以上陈述是什么意思? (f)printf() 的哪些方面使其不是信号处理程序安全的?是不是因为它访问的是全局的标准输出和标准输入,因此该函数不能重入?
或者还有其他我遗漏的方面吗?
【问题讨论】:
-
谁说它是线程安全的?
printf当然没有被指定为线程安全或可重入的。大多数实现可能没有太多内部共享状态(如果有的话),这可以使其被视为线程安全,但没有什么可以阻止多个线程将它们的输出混合在一起。 -
@JoachimPileborg:它是线程安全的,因为它不使用任何全局或静态局部变量。
-
@barakmanos:这是实现定义的,不是吗?标准中没有任何内容(至少到 C99)禁止
printf()使用静态局部变量,例如对于数字转换...(那将是一个 bad 实现,但不是不合格的实现...) -
我也没有在 POSIX 中看到任何东西,所以这里必须在图书馆作者方面使用常识。