ANSI C と OpenMPI ライブラリを使用しています。
私はこのコードを持っています:
if(myRank == 0)
{
printf("\n\tEnter bright: ");
scanf("%d", &bright);
}
しかし、プログラムを実行すると、最初にキーが押されるのを待ち(scanf)、次にprintfになります。何が起こっているのか本当にわかりません。
ありがとうございました。
これは特に MPI とはほとんど関係がなく、ごく普通の Unix I/O 動作です。標準出力ストリームはline bufferedです。これは、ストリーム内で新しい行が検出されるか、フラッシュ操作が強制されない限り、基になる I/O サブシステムに何も送信されないことを意味します。
以下を比較してください:printf("asdasd");
とprintf("asdasd\n");
. 最初のケースでasdasd
は、ストリームのバッファに追加されstdout
ますが、そこには新しい行がないため、バッファはフラッシュされず、実際には何も端末に送信されません。2 番目のケースasdasd
では、出力ストリームに追加され、新しい行が存在すると自動的にフラッシュされるため、asdasd<new line>
すぐに表示されます。John Zwinck によって既に示されているようにfflush(stdout);
、ストリーム バッファを強制的にフラッシュするために使用できます。
Windows バックグラウンドから来た場合、そこにある標準出力は行バッファリングされず、次の明示的なフラッシュ操作なしで出力されることにprintf("asdasd");
注意してください。adsasd
ただし、Windows でも、MPI の I/O リダイレクション メカニズムがライン バッファリングされている可能性があります。
そのような方法で scanf を使用することが理にかなっているのかどうか、最初に疑問に思います (複数のプロセスが関係します。それらのいずれかが端末/キーボードに接続されることをどのように知っているか、または想定しているのでしょうか?)。とにかく、印刷後にフラッシュしてみてください:
printf("\n\tEnter bright: ");
fflush(stdout);
scanf("%d", &bright);