2009年11月25日

printf() 與 fflush()

flush-t15018

有時候在用printf(),例如debug,會發現前面一句printf()的輸出反而會比後面一句printf()的輸出還慢,例如:

printf("111");
printf("222");
有時會先印出222

這種情況會造成很多的不確定性和debug困擾。

但如果在 printf() 後面加上 fflush(stdout); 就解決了。(這是在C,和C++的 flush 不太相同)

也就是改成以下就沒問題:

printf("111");
fflush(stdout);
printf("222");
fflush(stdout);

因為 fflush() 能把 stdout 這個 stream 的 buffer 強制沖(flush)出,也就是先寫出再說(write)。

講的可能不是很清楚,有興趣的話可以man fflush,或是google 「printf fflush」。

以下是我自己的摘錄:

NAME
fflush - flush a stream

SYNOPSIS
#include <stdio.h>
int fflush(FILE *stream);

DESCRIPTION
The function fflush() forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write function. The open status of the stream is unaffected.
If the stream argument is NULL, fflush() flushes all open output streams.

NOTES
Note that fflush() only flushes the user space buffers provided by the C library. To ensure that the data is physically stored on disk the kernel buffers must be flushed too, for example, with sync(2) or fsync(2).

順帶一提,google時有看到另一個不太一樣的問題,有人會用fflush(stdin) 來刷新scanf,這是沒定義的行為,不能亂用。

1 則留言:

walkingice 提到...

就我目前所知,print 的內容可能不會「即時寫出」,flush 是強制清光 buffer 以解決這個問題。

但是並不會有 print 前後次序不同的情況。會發生 "222" 先於 "111",應該是 print 的語句本身執行的先後問題,通常會發生又是在 multi-threading 的程式下。(而且 flush 沒有辦法解決)

若真有此種問題,能否多描述一點?感謝