read を呼び出した後に実際に何が起こるか:
n = read(fd, buf, try_read_size);
ここで fd は TCP ソケット記述子です。buf はバッファーです。try_read_size は、プログラムが読み取ろうとするバイト数です。
これにより、最終的にカーネルへのシステムコールが呼び出される可能性があると思います。しかし、誰かが詳細を提供できますか? glibc またはカーネル ソースでのソース コードの実装を教えてください。
read を呼び出した後に実際に何が起こるか:
n = read(fd, buf, try_read_size);
ここで fd は TCP ソケット記述子です。buf はバッファーです。try_read_size は、プログラムが読み取ろうとするバイト数です。
これにより、最終的にカーネルへのシステムコールが呼び出される可能性があると思います。しかし、誰かが詳細を提供できますか? glibc またはカーネル ソースでのソース コードの実装を教えてください。
大まかに見ると、次のようになります。
buf
を参照する範囲は、実際にはファイル記述子です)。何か問題がある場合は、負のエラー コード (-EFAULT など) が生成され、CPU がユーザー モードに戻り、呼び出しがラッパーに戻ります。buf+try_read_size
fd
proc
エントリまたはよりエキゾチックなものから読み取ることができます)min(available, try_read_size)
にコピーされbuf
、その量が戻りコード レジスタ (x86 では EAX) に書き込まれ、CPU がユーザー モードに切り替えられ、呼び出しがラッパーに戻ります。-EAGAIN
) が戻りコード レジスタに書き込まれ、CPU はユーザー モードに戻り、呼び出しはラッパーに戻ります。