22

私はカーニハンとリッチーの本で C を学んでいます。私は第 4 章 (「関数とプログラムの構造」) の基本にいます。先日、気になったsleep()のでこんな感じで使ってみました。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  printf(" I like cows.");
  sleep(5);
  return 0;
}

問題はプログラムの出力です。sleep()最初に を実行しprintf()てから . だから私は、プログラムが速すぎて、彼の仕事を私が望むように終わらせるsleep()ことができないのではないかと考えました。printf()

文字列を表示してからプログラムをスリープ状態にするにはどうすればよいですか? コンパイラは OpenBSD 4.3 の GCC 3.3.5 (propolice) です。

4

4 に答える 4

43

printf()stdout通常は行バッファリングされる (デフォルトの出力ストリーム) に書き込みます。プログラムが終了すると、すべてのストリームが自動的にフラッシュさsleepれるため、終了直前に出力されます。通常、改行を出力するとストリームがフラッシュされますが、代わりに次のfflush関数を使用することもできます。

int main(void)
{
  printf(" I like cows.\n");
  sleep(5);
  return 0;
}

また:

int main(void)
{
  printf(" I like cows.");
  fflush(stdout);
  sleep(5);
  return 0;
}

リダイレクトされた場合やファイルに書き込んでいる場合のように、行バッファリングされていないストリームに出力している場合stdout、単に改行を出力するだけではおそらく機能しません。fflushこのような場合、データをすぐに書き込みたい場合は使用する必要があります。

于 2008-12-03T18:46:22.743 に答える
8

あなたの問題は、printf(およびstdioライブラリを使用してstdout(標準出力)に書き込むその他のもの)がバッファリングされることです-コンソールに送られる場合は行がバッファリングされ、ファイルに送られる場合はサイズがバッファリングされます。fflush(stdout);の後にa を実行するprintfと、必要なことが実行されます。文字列に改行 ('\n') を追加するだけで、標準出力をファイルにリダイレクトしない限り、これで問題ありません。

100% 確信があるわけではありませんが、バッファリングされていないと思います。以前に に行った出力の前に にstderr行った出力が表示される可能性があるため、混乱を招く可能性があります。stderrstdout

于 2008-12-03T18:45:06.380 に答える
6

バッファリングとは、すべての出力が場所 (バッファーと呼ばれる) に格納され、そこに一定量のデータが存在した後に出力されることを意味します。これは、効率上の理由から行われます。

一部の (ほとんどの?) 実装では、コンソールへの書き込み時に改行の後にバッファーがクリアされるため、試すこともできます。

printf(" I like cows.\n");

fflush() の呼び出しの代わりに

于 2008-12-03T18:47:16.297 に答える