1

こんにちは、次はwhile 1を使用した単純なコードですが、実行すると、最初にprintfの最初の行を出力し、次に1秒間スリープしてから2行目を出力し、続行する必要がありますが、ここでは実行しません' t 端末で何かを取得すると、数秒後に突然すべてが出力され、スリープ状態に戻ります。何が起こっているのか正確にはわかりません。

int main(void)
{
  while(1)
 {
    printf("hello before sleep");
    sleep(1);
    printf("hello after sleep");
  }
}

しかし、上記の同じコードで、printf のすべての行の後に \n を使用すると、期待どおりに正常に動作します。なぜそうなのですか?

4

6 に答える 6

2

printfより一般的には、出力関数はバッファリングされます。予想される動作を確認したい場合は、スリープに入る前に出力をフラッシュする必要があります。

fflush(stdout);
sleep(1);
于 2013-07-25T13:46:43.103 に答える
2

printf は、改行に遭遇した場合、または出力バッファがいっぱいになった場合にのみフラッシュします。したがって、出力が実際に表示される正確な時間を制御するには、出力に改行を追加するか、フラッシュを強制して保留中の出力が実際に端末に送信されるようにします。

int main(void)
{
  while(1)
 {
    printf("hello before sleep");
    fflush(stdout);
    sleep(1);
    printf("hello after sleep");
    fflush(stdout);      }
}
于 2013-07-25T13:47:04.387 に答える
1

printf舞台裏での高価な呼び出しです。半分の行を印刷した場合、1 回のシステム コールですべてを表示できるように、さらにテキストが追加されることを期待して、出力がバッファリングされます。

于 2013-07-25T13:47:04.803 に答える
0

フラグを使用coutおよび設定することで、バッファの問題を回避できます。例を見るunitbuf

さらに、sleep()関数はミリ秒単位で実行を停止します。実行を 1 秒間停止したい場合は、次のように、渡されるパラメーターは 1000 になります。sleep(1000);

于 2013-07-25T13:56:20.880 に答える
0

実際には。あなたのコードは正しいです。

ただし、端末の出力ストリームはデフォルトではラインバッファです。

したがって、'\n' を使用するか、fflush() を呼び出すと、 printf を呼び出すコードの直後に、バッファーがフラッシュされ、単語が出力されます。

そうしないと、「hello before sleep」と「hello after sleep」という単語がすべてバッファに格納され、プログラムの終了時にexit 関数が呼び出され、プロセスが閉じられてバッファがフラッシュされ、単語が出力されます。

于 2013-07-25T14:07:22.157 に答える