2013-04-24 124 views
1

我以爲我在這裏做了簡單的事情,但C決定對我進行異步處理。我不確定發生了什麼事。這裏是我的代碼:爲什麼在打印任何內容之前,執行printf()函數,調用sleep(),爲什麼執行?

#include <stdio.h> 
int main() { 
    printf("start"); 
    sleep(5); 
    printf("stop"); 
} 

當我編譯和運行,我注意到sleep(5)的作品就像一個魅力。但編譯器認爲跳過第一個printf()並且出現故障是一個好主意,所以在運行時,程序等待5秒,然後打印startstop

這是怎麼回事?我的理論是程序用shell啓動打印操作,然後繼續執行程序,讓Bash等到程序不再忙時再實際渲染字符串。但我真的不知道。

由於

+0

[爲什麼printf在調用後不刷新,除非換行符在格式字符串中?](http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-這是一個新的電話號碼格式的限制) – 2013-04-24 02:54:31

+0

[爲什麼printf()在sleep()之前不打印任何東西?](https://stackoverflow.com/questions/ 338273/why-does-printf-not-print-anything-before-sleep) – 2017-07-26 22:37:10

回答

3

printf使用緩衝輸出。這意味着數據在被刷新到輸出源之前首先在內存緩衝區中累積,在這種情況下,該輸出源爲stdout(通常默認爲控制檯輸出)。在您的第一條printf語句後使用fflush強制它將緩衝的數據刷新到輸出源。

#include <stdio.h> 
int main() { 
    printf("start"); 
    fflush(stdout); 
    sleep(5); 
    printf("stop"); 
} 


另見Why does printf not flush after the call unless a newline is in the format string?

+0

謝謝!我應該知道會有更多。起初我以爲我有一個流氓Python安裝,嫉妒這個C程序與語法簡潔性相媲美。 – ICoffeeConsumer 2013-04-24 02:58:25

2

嘗試增加 '\ n' 你的printf語句,就像這樣:

#include <stdio.h> 
int main() { 
    printf("start\n"); 
    sleep(5); 
    printf("stop\n"); 
} 

編譯器不執行這沒有秩序。只是輸出正在累積,然後在程序退出時顯示。 '\ n'將調用tty驅動程序中的行紀錄來刷新輸出。

相關問題