printf and write

  一般在使用 printf 都會直接將結果印出在螢幕上,都不會發生問題,也不會發現其實 printf 的行為背後其實有一個緩衝區在紀錄。除非遇到 \n 或 程式結束,或者有其他東西要輸出,否則不會自動 flush 緩衝區,要強制清空緩衝區可以使用 fflush(stdout) 。

而 write(1 /*stdout*/, buffer ,size) 則可以直接將字串印到 stdout 中,不經由緩衝區處理。

  在一般的情況下還是 printf 效能會比較好,在多執行緒或多行程的情況下也比較不會有不合乎預期的情況發生。例如 兩個行程同時輸出 output 變成  ooututppuutt 之類的。

  會發生這種現象通常是在無窮迴圈的程式,由於程式沒有結束,又沒有輸出一些換行符號,造成輸出一直卡在緩衝區中。

#include <stdio.h>
int main()
{
  while(1)
  {
    printf("hello");// printf("hello\n")
    sleep(1);
  }
}

參考資料:

This entry was posted in C. Bookmark the permalink.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *