2011-11-29 70 views
4

我不明白爲什麼有時我需要使用fflush(),有時不需要。輸出不打印沒有fflush(標準輸出)

我的程序目前是segfaulting,我正在用打印語句進行調試。當程序出現段錯誤時,stdout不會自動刷新其緩衝區嗎?

+1

'stdout'只是一個指針,它本身並不「做」任何事情。真正的問題是,「操作系統不是沖洗所有打開的文件?」 –

回答

8

我不明白爲什麼有時我需要使用fflush(),有時不 。

有時stdio緩衝區刷新有時他們不是。例如,簡單地在打印的東西中包含「\ n」通常會將其刷新(因爲stdout在連接到終端時默認爲行緩衝)。

當一個程序段錯誤,stdout沒有自動刷新它的緩衝區 ?

Stdio緩衝區被沖刷exit。當一個信號(如SIGSEGV)殺死一個進程時,exit不叫。在不刷新緩衝區的情況下退出進程的另一種方法是使用特定於Unix的調用_exit

0

「我不明白爲什麼fflush(標準輸出)在此代碼中調用 我嘗試評論此行並且行爲完全相同。」

因爲如果 輸出沒有以換行符結束,您不能保證看到以前的printf()輸出。

基本上,你只需要它,如果你正在顯示說一個提示沒有 換行符,並且你想確保用戶可以看到它。

this site.

1

沒有,何必呢。該程序被操作系統殺死。如果發生段錯誤,則程序不再處於有意義的狀態,因此除了立即終止以外,沒有任何事情可以安全地發生。

(不要任何人嘗試註冊一個信號處理程序SIGSEGV

+0

在某些情況下,爲'SIGSEGV'註冊一個信號處理程序是有效的 - 例如,如果您使用'mmap'進行只讀映射,則可以通過信號處理程序捕獲並寫入'longjmp' ,並且這是100%(就POSIX而言)便攜且有效,只要寫入不是由異步信號不安全功能執行。 –

+1

@R ..:像往常一樣用「僞建議」:一旦你明白什麼時候可以忽略它,你可以放心地忽略它;-)無論如何,你必須最終終止程序;你無法從信號中恢復。 –