ハードウェアおよび OS レベルで scanf()/printf() が実際にどのように機能するのか疑問に思っていました。データはどこに流れ、OS はこの時期に何をしているのでしょうか? OS はどのような呼び出しを行いますか? 等々...
4 に答える
scanf() と printf() は libc (C 標準ライブラリ) の関数であり、オペレーティング システムのシステム コール read() と write() をそれぞれ呼び出し、ファイル記述子 stdin と stdout とそれぞれ対話します (fscanf と fprintf を使用すると、読み取り/書き込み元のファイル ストリームを指定します)。
read() と write() (およびすべてのシステムコール) を呼び出すと、ユーザーレベルのアプリケーションからカーネル モードへの「コンテキスト スイッチ」が発生します。これは、ハードウェアと直接通信するなどの特権操作を実行できることを意味します。アプリケーションの起動方法に応じて、'stdin' および 'stdout' ファイル記述子はおそらくコンソール デバイス (tty0 など)、またはある種の仮想コンソール デバイス (xterm によって公開されるようなもの) にバインドされます。read() と write() は、「uio」と呼ばれるカーネル バッファとの間でデータを安全にコピーします。
scanf と printf のフォーマット文字列変換部分はカーネル モードでは発生しませんが、通常のユーザー モード (「libc」内) では発生します。syscall の一般的な経験則は、できるだけ頻繁にカーネル モードに切り替えることです。コンテキスト切り替えのパフォーマンス オーバーヘッドを回避し、セキュリティを確保します (カーネル モードで発生することには十分注意する必要があります! カーネル モードでのコードが少ないということは、オペレーティング システムのバグやセキュリティ ホールが少ないことを意味します)。
ところで..これはすべてUNIXの観点から書かれたもので、MS Windowsがどのように機能するかわかりません。
私のOSでは、scanfとprintfを使用していますが、これらは関数getch() ant putch()に基づいています。
OS は、入力用と出力用の 2 つのストリームを提供するだけだと思います。ストリームは、出力データがどのように表示されるか、または入力データがどこから来るかを抽象化します。
したがって、 scanf と printf が行っているのは、どちらかのストリームからバイトを追加する (またはバイトを消費する) ことだけです。