特定のプロセスをブロックする高レベル関数呼び出しをトレースしようとしています。そのような例はscanfです。これは '\ n'を受信するまで端末をブロックします。今度はscanfをgetcまでトレースしました(scanfはgetcを使ってstdinから文字を取得します)。私の質問は、キーボードから、カーネルを通ってgetcを返すまでのデータをどのように解釈するのか?また、scanfが端末を停止させる方法もあります(コンピュータがアイドリングしているか、別の作業をしていますか)。 ありがとうございますCブロッキングシステムコールのトレース
答えて
プロセスがシステムコール(ブロッキングread(2)
など)を発行するたびに、プロセスはカーネルモードで実行を開始します。つまり、特定のシステムコールを処理するカーネルコードが呼び出されます。
その後、デバイスとドライバによっては、プロセスを中断して待機キューに入れることができます。キーが押されると、割り込みを処理するカーネルコードが呼び出され、そこからどのキーが押されたかが差し引かれます。
カーネルは、この入力を待っているプロセスを再開し、カーネルアドレス空間から特定のプロセスのアドレス空間にデータをコピーしてデータを配信します。
システムコールにより、ユーザプログラムは事前に実行されたモードで実行されます。ユーザプログラムがシステムコールを行うと、割り込み0x80が発生します。カーネルが割り込みを受け取ると、0x80の割り込み記述子テーブル(IDT)のルックアップを行い、対応するハンドラ(syscall)を実行します。このハンドラの実行後、カーネルメモリからユーザメモリに情報をコピーした後、制御はユーザプログラムに転送されます。
この場合、scanfはライブラリ関数 "read"にマップされます。 "read"システムコールは "sys_read"を呼び出し、次にそれはgetcを使用して入力ストリームSTDINから読み込みます。お役に立てれば!
必ずしもint 80hではありません。 x86は 'SYSCALL/SYSENTER'も提供しています。 –
- 1. ステートマシンのブロッキングシステムコールとコールイベント
- 2. Cの自動エントリ終了トレース
- 3. Erlangの動的トレースのトレース: 'depth'フィールド
- 4. クロージャのトレース
- 5. シェアポイントのロギング/トレース
- 6. NullReferenceExceptionのトレース
- 7. パケットのトレース
- 8. ジャーナルファイルシステムのトレース
- 9. HaxeFlixelトレース
- 10. Turbo C++のトレース(F7)とステップオーバー(F8)の違いは何ですか?
- 11. C#&Word:Wordでトレースを元に戻すのを止めるには?
- 12. このC再帰プログラムをトレースする方法
- 13. C++ GNU xgettexの実行をトレースする方法は?
- 14. AndroidプログラミングのABCトレース
- 15. トレース出力のフォーマット
- 16. tkinterのトレース方法
- 17. トレース/デバッグPowerShellのオペレーター
- 18. GKE 403のStackdriverトレース
- 19. ブロックレベルのI/Oトレース
- 20. SQL例外のトレース
- 21. トレースをクリーンアップ
- 22. Oracleトレースall SELECTS
- 23. ジップキン - 分散トレース
- 24. Tkinter varトレース
- 25. なぜ `String#size`のようなメソッドへのトレース・トレースはトレースされませんか?
- 26. Big O QuickSortアルゴリズムで反復をトレースする方法は? C
- 27. C#最も単純なトレースまたはログ
- 28. VB.NETでのコードレベルのトレース
- 29. PeopleSoftのIPアドレスのトレース
- 30. Pythonでのコードのトレース
あなたは 'strace'を指摘するように頼んでいるのですか、一般的にシステムコールをブロックする方法を尋ねていますか? – cha0site
アセンブラレベルでの処理方法に興味があれば、http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor
gdbなどのデバッガで実行してみてください。 control-Cを押し、 "bt"と打ちます。 Scanfは、readを呼び出すgetcを呼び出します。これは、実際に読み取る必要があるまで返されないシステムコールです。あなたは読まれてブロックされています。 – wildplasser