2012-02-03 99 views
6

我正在嘗試追蹤阻止特定進程的高級函數調用。這樣的一個例子是scanf,它阻止終端,直到收到'\ n'。現在我將scanf追蹤到getc(scanf使用getc從stdin獲取字符)。我的問題是,解釋來自鍵盤的數據,整個內核以及getc的返回所需的過程是什麼?此外,scanf如何終止終端(計算機是閒置還是處理其他任務)? 謝謝追蹤C阻塞系統調用

+3

您是在要求我們指出'strace',還是您要問在一般情況下如何阻止系統調用? – cha0site 2012-02-03 11:30:20

+1

如果您對如何在彙編級別上完成它感興趣:http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor 2012-02-03 11:31:42

+2

嘗試在調試器(如gdb)下運行它。點擊control-C,然後輸入「bt」。 Scanf調用getc,它調用read,這是一個系統調用,只有在實際需要讀取時纔會返回。你在閱讀中被封鎖。 – wildplasser 2012-02-03 11:32:50

回答

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