我正在嘗試追蹤阻止特定進程的高級函數調用。這樣的一個例子是scanf,它阻止終端,直到收到'\ n'。現在我將scanf追蹤到getc(scanf使用getc從stdin獲取字符)。我的問題是,解釋來自鍵盤的數據,整個內核以及getc的返回所需的過程是什麼?此外,scanf如何終止終端(計算機是閒置還是處理其他任務)? 謝謝追蹤C阻塞系統調用
6
A
回答
5
只要進程發出系統調用(例如阻塞read(2)
),進程就開始在內核模式下執行,即處理特定系統調用的內核代碼被調用。
之後,根據基礎設備和驅動程序,可以掛起進程並放入等待隊列。當一個鍵被按下時,處理中斷的內核代碼被調用,並從那裏扣除哪個鍵被按下。
內核然後恢復正在等待此輸入的進程,並通過將內核地址空間複製到特定進程的地址空間來傳遞數據。
1
系統調用使用戶程序能夠以previliged模式執行。當用戶程序進行系統調用時,它會生成中斷0x80。當內核收到中斷時,它將在中斷描述符表(IDT)上查找0x80並執行相應的處理程序(系統調用)。執行此處理程序後,將控制信息從內核內存複製到用戶內存後,將轉移到用戶程序。
在這種情況下,scanf被映射到庫函數「read」。 「read」系統調用調用「sys_read」,然後使用getc從輸入流STDIN中讀取數據。希望這可以幫助!
+0
它不一定是'int 80h'。 x86也提供了'SYSCALL/SYSENTER'。 – 2012-02-03 14:30:47
相關問題
- 1. Qt - 系統級調用阻塞的QThreads
- 2. 使用fork的C++程序中的非阻塞系統調用
- 3. 我想讓接受系統調用爲非阻塞。我如何使接受系統調用爲非阻塞?
- 4. 阻塞來電android系統
- 5. 眼動追蹤系統
- 6. 如何使阻塞/同步調用進入Akka actor系統?
- 7. 如何在Ruby中創建非阻塞系統調用?
- 8. 是狀態機中的阻塞系統調用呼叫事件
- 9. 哪些POSIX系統調用可能會阻塞進程?
- 10. 在FIFO上打開系統調用不阻塞?
- 11. 是否有任何系統調用阻塞內存
- 12. Linux阻止系統調用
- 13. 系統重疊標籤阻塞DialogFragment
- 14. 非阻塞版本的系統()
- 15. AVAudioSession阻塞系統的音頻
- 16. WCF阻塞調用
- 17. Oracle中的審計追蹤系統
- 18. 全球定位系統追蹤問題
- 19. 與PHP類似的Twitter追蹤系統
- 20. 追蹤日誌文件系統
- 21. 在C程序中阻塞系統命令
- 22. C套接字阻塞調用
- 23. 調用C「系統」 ++
- 24. 系統Verilog中的++操作符是阻塞的還是非阻塞的?
- 25. 追蹤Pthread調用
- 26. c#跟蹤系統。診斷
- 27. 查找阻塞調用
- 28. 阻塞函數調用
- 29. CUDA內核調用阻塞?
- 30. 使API調用阻塞nodejs
您是在要求我們指出'strace',還是您要問在一般情況下如何阻止系統調用? – cha0site 2012-02-03 11:30:20
如果您對如何在彙編級別上完成它感興趣:http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor 2012-02-03 11:31:42
嘗試在調試器(如gdb)下運行它。點擊control-C,然後輸入「bt」。 Scanf調用getc,它調用read,這是一個系統調用,只有在實際需要讀取時纔會返回。你在閱讀中被封鎖。 – wildplasser 2012-02-03 11:32:50