簡體   English   中英

程序出口處的printf flush

[英]printf flush at program exit

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

我們來看下面的代碼:

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

在這種情況下, printf()如何設法將其緩沖區刷新到stdout

我想這是平台依賴的,所以讓我們采取Linux。

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

任何解釋或文檔鏈接表示贊賞。 謝謝。

當運行exit()時,C運行時將注冊atexit()處理程序以刷新標准緩沖區。

看到這個解釋

當程序正常退出時, exit功能始終執行標准I / O庫的干凈關閉,這會導致刷新所有緩沖的輸出數據。

從main函數返回一個整數值相當於使用相同的值調用exit。因此, return 0exit(0)具有相同的效果

如果_Exit_exit ,則進程將立即終止,IO將不會被刷新。

只是為了擴展trofanjoe的回應:

退出導致程序正常終止。 以相反的注冊順序調用atexit函數,刷新打開的文件,關閉打開的流,並將控制權返回給環境。

main中 ,return expr等同於exit(expr)。 exit的優點是可以從其他函數調用它

從我的機器上的man stdio (強調添加),運行RHEL 5.8:

隨后可以通過相同或另一個程序執行重新打開文件,並且回收或修改其內容(如果它可以在開始時重新定位)。 如果main函數返回其原始調用者,或者調用exit(3)函數,則在程序終止之前關閉所有打開的文件(因此刷新所有輸出流)。 其他程序終止方法,例如abort(3),並不打算正確關閉文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM