2014-01-30 33 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

相關問題