
~からLinuxプログラミングインターフェース:(
関連部分を読みました。説明のためにこの要約図を貼り付けました。)
私はそれが使用する直接IOread
とwrite
システムコールを知っています。レベル2のバッファリングがあります。read/write buffer
+ kernel buffer
。
stdio
直接システムIO呼び出しの上に構築されたライブラリ呼び出しを使用する場合、
stdio buffer
+read/write buffer
+kernel buffer
、レベル 3 バッファリング、
または
stdio
write/read
同じバッファを共有します。レベル2バッファリング
stdio calls
<---> user buffer
<------> read/write
+kernel buffer
?
(これはレベル2バッファリングのようですが、確実に確認したいです。)
答え1
一般的な状況では、2つのレベルがあります。ユーザー空間のバッファはstdioライブラリによって割り当てられ、put / printf / fprintfなどを呼び出すとバッファに文字が入力されます。いくつかのステップ(例えば、バッファがいっぱいになったり改行文字が作成されたりストリームがラインバッファモードの場合)では、stdioライブラリ呼び出しはカーネルwrite
にバッファに書き込むように要求します。カーネルは通常、バッファをカーネルバッファにコピーし、データをターゲットにインポートするために必要なすべての操作を開始して返します。これにより、ユーザースペースは必要に応じてユーザースペースバッファーを使用できます。
別の方法で実行される他のstdio実装を持つことが可能です(一般的ではありません)。SFIOstdio互換性レイヤがあります。zero copy
など様々な方案が提案されました。ポイントは、stdio
効果がどのように行われたのかを知らせるのではなく、効果が何であるかを知らせることです。