LINUX/glibc的.我可以在信号处理程序中使用fprintf吗?

osg*_*sgx 2 linux signals glibc handler

我可以fprintf(stderr)在glibc/linux的信号(SIGALRM)处理程序中使用吗?

Fab*_*ian 6

你不能.检查联机帮助 信号(7)以获取异步信号安全功能列表.fprintf不包括在该列表中.

如果您不需要格式化,则可以使用write(STDERR_FILENO, <buf>, <buflen>)写入stderr.


ism*_*ail 5

这不安全,引用 IBM DeveloperWorks 文章 Signal Handling Safety

假设信号处理程序使用 fprintf 打印一条消息,并且程序在传递信号时使用相同的流进行 fprintf 调用。信号处理程序的消息和程序的数据都可能被破坏,因为这两个调用都对相同的数据结构进行操作:流本身。

  • @osgx:不,你没有说“线程”。但是您声称该锁有助于防止损坏。不会。该锁旨在同步线程之间的访问,而不是线程的主代码和同一线程的信号处理程序之间的访问。要么您有一个可重入锁,它对信号处理程序绝对没有影响并且损坏仍然发生,要么您有一个非重入锁,这会导致死锁。在这两种情况下,`fprintf` 中的锁的存在都不会以任何方式改变“这不安全”的正确答案。 (7认同)
  • @osgx:信号处理程序不是线程。在信号处理程序中等待是非常糟糕的消息,因为在信号处理程序完成之前,持有锁的线程无法取得进展。所以你有一个僵局。 (6认同)