2014-01-30 24 views
1

好吧,标题说的大部分。fflush可以安全地从信号处理程序中调用吗?

假定我的应用程序正在记录到stdout/file。但是,当终止时,并不总是完全刷新。一种解决方案是在每次记录操作后刷新,但是这会使程序放慢,令人无法接受。

所以,问题是,从信号处理程序可以安全地调用fflush(file),甚至可能是fflush(NULL)

如果不是,请给出一个想法为什么。是否有解决这个问题的其他解决方案?如果我知道我不在文件处理例程中,它可能安全吗?

+0

没有,因为在[手册](http://man7.org/linux/man-pages/man7/signal.7.html)授权的功能列表让呼叫信号处理程序中此功能是安全的。不包括'fflush()'。 –

回答

2

您只能在信号处理程序中使用异步安全函数,并且不包括stdio库。 POSIX标准定义了一组异步安全的函数。您尚未指定该平台,但我不知道一般解决方案。

如果存储的文件描述符支持的文件 - 使用fileno() - 一个POSIX/BSD系统上,你可以使用异步安全功能打捞的东西:write()lseek()(齐平),fsync()等。这的当然,如果stdio使用自己的缓冲区,它将无济于事。

(some Cert-C guidelines)

+0

我刚刚发现:https://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html“但是,如果您知道处理程序使用的流不可能一次被程序使用当信号能够到达时,那么你是安全的,如果程序使用其他流,这没有问题。“所以,如果我可以保证没有其他函数写入某个流,那么调用'fflush(that_object)',理论上应该是安全的,否? – heinrich5991

相关问题