[解決済み] write() to stdout と printf 出力がインターリーブされていない?
2022-01-30 08:52:08
質問
#include <stdio.h>
#define MAXLEN 256
int main() {
int n;
char buf[MAXLEN];
while((n = read(0,buf,sizeof(buf))) != 0){
printf("n: %d:",n);
write(1,buf,n);
}
return 1;
}
プログラムの出力(ここで、最初の
read
と最初の
write
がユーザーによって入力され、端末によってエコーされる)は
read
read
write
write
n: 5:n: 6:
標準入力でCtrl+Dを押した後にprintfが出力され、その後の読み込みに伴って出力されません。なぜこのようなことが起こるのでしょうか?
解決方法は?
Printfはバッファリングされています。
fflush 呼び出しを使用すると、printf のバッファを強制的に「フラッシュ」させることができます。
#include <stdio.h>
#define MAXLEN 256
int main() {
int n;
char buf[MAXLEN];
while((n = read(0,buf,sizeof(buf))) != 0){
printf("n: %d:",n);
fflush(stdout); /* force it to go out */
write(1,buf,n);
}
return 1;
}
一般的には
printf()
バッファリングされることは良いことです。 バッファリングされていない出力、特に画面の更新などを必要とする目に見えるコンソールへの出力は遅いです。 プリントアウトを多用するアプリケーションが直接的に遅くなるくらい遅いのです(特にWindowsプラットフォームで。LinuxやUnixは一般的に影響が少ないです)。
しかし
printf()
を使用すると、バッファリングされることになります。
fprintf(stderr,)
-
stderr
は意図的にバッファリングされていません。 その結果、メッセージにいくつかの
printf()
が欠落している場合、別の
FILE
ハンドルはターミナルとも関連付けられており、バッファリングされていない可能性があるので、最初に明示的に
fflush(stdout)
.
関連
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み] ファイルにログを記録し、標準出力に印刷するためのロガー設定
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Bashで標準出力と標準エラーの両方をファイルにリダイレクトして追記する方法
-
[解決済み] 出力をファイルや標準出力にリダイレクトする方法
-
[解決済み] 標準出力ではなく標準エラー出力にパイプを通すにはどうしたらいいですか?
-
[解決済み] Bashでstderrとstdoutをリダイレクトする [重複]。
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】未定義参照 makefile が間違っているのかも?