2010-11-17 217 views
6

可能重複:
Why does printf not flush after the call unless a newline is in the format string? (in C)睡眠()延遲輸出,直到結束

嗨,

我使用的睡眠()函數在C,並正在到一個問題:我不確定這是否是問題所以我把整個代碼煮成這樣:

int main() { 

    printf("1"); 
    sleep(3); 
    printf("2"); 

    return 0; 
} 

我認爲這應該產生的是1 ..等待3秒.. 2.而是程序等待3秒,然後打印12.有什麼辦法使用睡眠功能,以便我得到第一個輸出?

感謝

+0

正如我在下面提到的,我不知道這是問題的原因。 – 2010-11-17 03:08:44

回答

3

這不是真正的睡眠功能被延遲輸出,這是標準輸出流的緩衝性質。 2的輸出是幾乎肯定也是延遲,直到你的程序退出主程序,但延遲有這麼小,你沒有注意到它。

如果可以檢測到標準輸出是指交互式設備(否則它是完全緩衝的),則標準輸出是行緩衝的。

如果您在fflush (stdout)之後立即看到每個輸出呼叫,那就會解決問題。

或者,您也可以在stdout操作之前使用setvbuf,將其設置爲無緩衝,你會不會擔心將所有這些fflush行代碼:

setvbuf (stdout, NULL, _IONBF, BUFSIZ); 

只要記住,如果您將輸出發送到文件,可能會影響性能。同時請記住,對此的支持是由實施定義的,並非由標準保證。

ISO C99部7.19.3/3是相關位:

當流是無緩衝,字符旨在儘快從源或目的地出現。否則,字符可能會累積並作爲塊向主機環境或從主機環境傳輸。

當一個數據流是完全緩衝,字符是打算作爲一個塊填充緩衝區時發送到主機環境或從主機環境傳輸。

當一個流爲行緩衝,當遇到換行符時,打算將字符作爲塊傳送到主機環境或從主機環境傳送出去。

此外,當填充緩衝區,在非緩衝流上請求輸入時,或者在需要傳輸字符的行緩衝流上請求輸入時,字符旨在作爲塊傳輸到主機環境來自主機環境。

對這些特性的支持是實現定義的,可能會通過setbufsetvbuf函數受到影響。

1

標準庫緩衝區輸出,等到有足夠的輸出攤銷的實際印刷成本。

必須在每個印刷後刷新緩衝區,以確保代碼繼續之前,這將是印:

fflush(stdout); 
+0

它不是執行緩衝的操作系統,它是標準庫。 – 2010-11-17 03:06:09

+0

@克里斯 - 謝謝,更正。 – 2010-11-17 03:09:46

1
+3

如果你可以簡單地通過鏈接到另一個問題來回答,它是一個重複的 - 你應該只是發表評論讓我們知道,所以我們可以把它作爲重複。 – Cascabel 2010-11-17 03:05:06

+0

我不知道這是它背後的問題,我認爲這是由sleep()函數中的某些內容引起的,但是會自己添加註釋。 – 2010-11-17 03:07:58

0

嘗試:

int main() { 

    printf("1"); fflush(stdout); 
    sleep(3); 
    printf("2"); fflush(stdout); 

    return 0; 
} 

強制IO庫清空後睡眠前的緩衝區和返回語句。