作為中斷處理的另一個示例,下面介紹linux系統中shell命令的一般執行過程。
Linux系統提供給用戶的最重要的系統程序是shell命令語言解釋程序。它不屬于內核部分,而是在核心之外以用戶態方式運行。
其基本功能是解釋并執行用戶輸入的各種命令,實現用戶與Linux核心的接口。系統初啟后,核心為每個終端用戶建立一個進程去執行shell解釋程序。它的執行過程基本上按照如下步驟進行:
(1)讀取用戶由鍵盤輸入的命令行。
(2)分析命令,以命令名作為文件名,其他參數改造為系統調用execve( )內部處理所要求的形式。
(3)終端進程調用fork( )建立一個子進程。
(4)終端進程本身用系統調用wait4( )來等待子進程完成(如果是后臺命令,則不等待)。當子進程運行時調用execve( ),子進程根據文件名(即命令名)到目錄中查找有關文件(這是命令解釋程序構成的文件),調入內存,執行這個程序(即執行這條命令)。
(5)如果命令末尾有&號(后臺命令符號),則終端進程不用執行系統調用wait4( ),而是立即發提示符,讓用戶輸入下一個命令,轉步驟(1)。
如果命令末尾沒有&號,則終端進程要一直等待,當子進程(即運行命令的進程)完成工作后要終止,向父進程(終端進程)報告,此時終端進程醒來,在做必要的判別等工作后,終端進程發提示符,讓用戶輸入新的命令,重復上述處理過程。
shell命令基本執行過程
以上介紹的僅是shell作為命令解釋程序的基本工作原理,其實際工作過程是很復雜的。
既便如此,我們從中也可以體會到:進程是動態活動的,父子進程間構成族系,彼此間有同步關系,進程間的切換是由進程調度程序實現的。大家如果有興趣的話,可結合上機實習,深入想一想命令的執行過程。