Linuxシステムプログラミング15システムコールIO-システムIOと標準IOの比較例

ファイルIOと標準IOの違い:

例:通信室の老人が郵便局に
駆け寄る方法1:郵便物を求めて郵便局に1回来る
方法2:持ち運べる郵便物の量を積み上げた後、100文字だとします。一度郵便局に行く
方法3:郵便物を受け取る過程で、運ぶことができる郵便物の数が100に達していない。突然緊急郵便物がある。次に、緊急郵便物と以前に受け取った郵便物を郵便局に持っていく。オフィス。

老人の送信タスクはバッファ操作と同等であり、緊急アクションはバッファを更新するためのfflush()と同等です。

標準IOにはバッファメカニズムがあります。つまり、標準IOの操作は、操作が完了した直後には実行されず、現在のファイルのバッファに配置されます。現時点では、実際にはディスクに書き込まれません。待機します。バッファがいっぱいになるまで。改行または強制リフレッシュの場合、つまり、ラインバッファリング、フルバッファリング、バッファリングなしなどが適用されます。そうして初めて、アクションが一緒に実行されます。つまり、リフレッシュ後にシステムIOが呼び出されてディスクに書き込みます。

システムコールIOは、実際にはユーザー状態からカーネル状態に切り替えられ、呼び出されるたびに1回実行されます。つまり、システムコールIOのリアルタイムパフォーマンスは非常に高くなります。

したがって、システムコールIOの効果は高速です。標準IOのスループットが大きい、つまり、システムコールIOを組み合わせることができます

ファイルIO変換標準IO:fileno()、fdopen()

標準IOとファイルIOを混在させることはできません。
標準IO操作が更新されない場合、ファイル変更はディスクに書き込まれないため、標準IOとファイルIOを混在させることはできません。これは、対応するファイルIO、つまりファイル属性の情報が実行されていないことを意味します。構造空間FILE *の情報と同期していません。次の図によると、標準IOが2つのfputc(fd)操作を実行するが、更新されない場合、FILEのposの後にpos ++が続きますが、バッファーが更新されない可能性があるため、対応するファイルは変更されない可能性がありますつまり、対応するファイルIOのファイル属性構造は更新されません。このとき、ファイル属性構造のposはFILEのposとは異なり、jはファイルの現在の位置ポインタであり、いつバッファを更新します。つまり、ラインバッファ、フルバッファリング、バッファリングなしなどです。バッファリング後、ファイル属性構造のposがFILEのpos値に一度に追加されます。

再び世界を書くときと同じように、書き込みの途中でドキュメントを閉じます。このとき、書き込まれたコンテンツを保存するかどうかのプロンプトが表示されます。このプロンプトは、バッファを更新するかどうかです。このとき、 FILEはファイル属性構造の情報と同期されていません。「はい」をクリックすると、バッファが更新されます。その場合にのみ、情報が同期され、変更されたコンテンツがディスクに書き込まれます。
ここに画像の説明を挿入

実験1:標準IOとファイルIOの混合使用

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

int main()
{
	putchar('a');
	write(1,"b",1);

	putchar('a');
	write(1,"b",1);

	putchar('a');
	write(1,"b",1);

	exit(0);
}
mhr@ubuntu:~/work/linux/sysio/15$ gcc ab.c 
mhr@ubuntu:~/work/linux/sysio/15$ ./a.out 
bbbaaamhr@ubuntu:~/work/linux/sysio/15$ 

出力bbbaaa

straceコマンドを使用して、実行可能プログラムのシステムコールがどのように発生するかを確認します

mhr@ubuntu:~/work/linux/sysio/15$ 
mhr@ubuntu:~/work/linux/sysio/15$ strace ./a.out 
....
.....
.... 
write(1, "b", 1b)                        = 1
write(1, "b", 1b)                        = 1
write(1, "b", 1b)                        = 1
write(1, "aaa", 3aaa)                      = 3
exit_group(0)                           = ?
+++ exited with 0 +++
mhr@ubuntu:~/work/linux/sysio/15$ 

最初に
bwrite(1、 "b"、1);
write(1、 "b"、1);
write(1、 "b"、1);を出力します。

他の3つの標準
IOputchar( 'a');
putchar( 'a');
putchar( 'a');
aを出力バッファーに入れ、最後にバッファーを更新します。つまり、ファイルIO write()を呼び出します。 1回の書き込み、つまり書き込み(すべてバッファー内)。複数回呼び出されるのではなく、バッファーのすべての内容を一度に書き込むための1回の呼び出しのみであることに注意してください。

おすすめ

転載: blog.csdn.net/LinuxArmbiggod/article/details/105903189