簡體   English   中英

為什么這個c程序不打印第一個printf語句?

[英]why doesn't this c programme print the first printf statement?

#include<stdio.h>
#include <unistd.h>
int main(){
      while(1)
      {

              fprintf(stdout,"hello-out");
              fprintf(stderr,"hello-err");
              sleep(1);
      }
      return 0;
}

在gcc中編譯這個程序並執行它只打印hello-err而不是hello-out。為什么會這樣?有人可以解釋它背后的原因嗎?

如果您在郵件中添加'\\n' ,它將(或應該),即。 "hello-out\\n"

原因是stdout緩沖以便更有效,而stderr不緩沖它的輸出,更適合於錯誤消息和需要立即打印的東西。

stdout 通常會在以下情況下刷新

  • 要打印換行符( \\n
  • 你從stdin讀入
  • fflush()被調用

編輯:我想在計算機崩潰之前添加的另一件事...兩次......是你也可以使用setbuf(stdout, NULL); 禁用緩沖stdout 在我不得不使用write() (Unix)並且不希望我的輸出被緩沖之前,我已經這樣做了。

它並不總是將輸出打印到stdout,因為設計stdout是BUFFERED輸出,而stderr是無緩沖的。 通常,對於緩沖輸出流,直到系統“自由”執行此操作才會轉儲流。 因此,在刷新之前,數據可以持續緩沖很長一段時間。 如果要強制緩沖區沖洗,可以使用fflush手動執行此操作

#include<stdio.h>
#include <unistd.h>
int main(){
      while(1)
      {

              fprintf(stdout,"hello-out");
              fflush(stdout); /* force flush */
              fprintf(stderr,"hello-err");
              sleep(1);
      }
      return 0;
}

更新:當連接到終端時, stdout是行緩沖的,否則只是緩沖(例如重定向或管道)

你忘記了字符串中的換行符(注明\\n )。 或者你需要調用fflush(NULL); 或至少fflush(stdout); sleep(1);sleep(1);

fprintf(stdout, ...)printf(...)相同

您需要輸出換行符或調用fflush因為(至少在Linux上) stdout FILE緩沖區是行緩沖的。 這意味着C庫正在緩沖數據,並且當緩沖區足夠滿時,或者當您使用新行或使用fflush刷新它時,它將真正輸出它(使用write Linux 系統調用 )。 需要緩沖,因為系統調用成本很高(為輸出的每個字節調用write非常慢)。 另請閱讀setbuf的手冊頁

暫無
暫無

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

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