【发布时间】:2010-12-29 12:36:02
【问题描述】:
我可以在带有 glibc/linux 的信号 (SIGALRM) 处理程序中使用fprintf(stderr) 吗?
【问题讨论】:
标签: linux signals handler glibc
我可以在带有 glibc/linux 的信号 (SIGALRM) 处理程序中使用fprintf(stderr) 吗?
【问题讨论】:
标签: linux signals handler glibc
不,你不能。查看手册页 signal(7) 以获取异步信号安全函数列表。 fprintf 不包含在该列表中。
如果您不需要格式化,则可以使用write(STDERR_FILENO, <buf>, <buflen>) 写入stderr。
【讨论】:
这不安全,引用 IBM DeveloperWorks 关于Signal Handling Safety 的文章
假设信号处理程序使用 fprintf 打印一条消息,并且程序在传递信号时使用同一流进行 fprintf 调用。信号处理程序的消息和程序的数据都可能被破坏,因为这两个调用都在同一个数据结构上操作:流本身。
【讨论】:
fprintf 内部的锁都不会以任何方式改变“这不安全”的正确答案。