2013-06-21 29 views
11

我很想知道當程序退出時printf()函數的flush是如何工作的。程序退出時的printf flush

讓我們以下面的代碼:

int main(int ac, char **av) 
{ 
    printf("Hi"); 
    return 0; 
} 

在這種情況下,如何printf()管理刷新其緩衝區stdout

我想這是平臺依賴的,所以我們來看看Linux吧。

它可以使用gcc__attribute__((dtor))實現,但標準庫將依賴於編譯器。我認爲這不是它的工作方式。

讚賞任何解釋或指向文檔的鏈接。謝謝。

回答

10

當調用exit()時,C運行時將註冊atexit()處理程序以刷新標準緩衝區。

看到這個explanation

+3

+1,好點,_within main,返回expr相當於exit(expr)._ –

1

man stdio這裏我的機器上(強調),whic運行RHEL 5.8:

的文件可以隨後重新打開,由同一個或另一個 程序的執行,和它的內容再生或修改(如果它可以在開始時重新定位 )。 如果主函數返回到其原始調用方的 ,或者調用了exit(3)函數,則在終止程序 之前,所有打開的文件都是關閉的(因此所有輸出流都被刷新) 。程序終止的其他方法,如中止(3) 不打擾正確關閉文件。

2

當程序正常退出時,exit函數始終執行標準I/O庫的乾淨關閉,這會導致所有緩衝的輸出數據被刷新。

從主函數返回一個整數值等同於調用具有相同value.So出口,return 0具有exit(0)

相同的效果如果_Exit_exit叫,該進程將立即終止,則IO不會被刷新。

3

只是爲了擴大trofanjoe的迴應:

出口導致正常程序終止。 atexit函數被調用 反註冊順序,打開文件被刷新,打開的流 被關閉,並且控制被返回到環境。

主要,返回expr是等同於退出(表達式)。退出有 的好處,它可以從其他功能調用