2

ここでは簡単なことをしていると思っていたのですが、C は私を非同期にすることにしました。何が起こっているのかわかりません。これが私のコードです:

#include <stdio.h>
int main() {
    printf("start");
    sleep(5);
    printf("stop");
}

sleep(5)コンパイルして実行すると、それが魅力のように機能することに気付きます。printf()しかし、コンパイラは、最初をスキップして順不同にするのが良い考えであると判断したため、実行時にプログラムは 5 秒間待機してから を出力しstartstopます。

どうしたんだ?私の理論では、プログラムはシェルで印刷操作を開始してからプログラムを続行し、プログラムが実際に文字列をレンダリングするためにビジーでなくなるまで Bash を待機させるというものです。しかし、私は本当に知りません。

ありがとう

4

3 に答える 3

4

printfバッファリングされた出力を使用します。これは、データが出力ソースにフラッシュされる前に、最初にメモリ バッファーに蓄積されることを意味しますstdoutfflush最初のステートメントの後に使用しprintfて、バッファリングされたデータを出力ソースに強制的にフラッシュします。

#include <stdio.h>
int main() {
    printf("start");
    fflush(stdout);
    sleep(5);
    printf("stop");
}


また、改行が書式文字列に含まれていない限り、呼び出し後に printf がフラッシュされないのはなぜですか?も参照してください。

于 2013-04-24T02:52:31.127 に答える
2

次のように、printf ステートメントに '\n' を追加してみてください。

#include <stdio.h>
int main() {
    printf("start\n");
    sleep(5);
    printf("stop\n");
}

コンパイラはこれを順不同で実行していません。出力だけが蓄積され、プログラムの終了時に表示されます。'\n' は、出力をフラッシュするために tty ドライバーのライン制御を呼び出します。

于 2013-04-24T03:21:38.393 に答える
0

この Q&A を読んでください。

于 2013-04-24T02:54:18.813 に答える