1. 程式人生 > >linux下shell命令解析器

linux下shell命令解析器

shell是一個命令語言解析器,有自己內建的shell命令集,shell也能被系統中其他應用程式所呼叫。使用者在提示符下輸入的命令都由shell先解釋然後傳給linux核心。 當普通使用者成功登陸,系統將執行一個稱為shell的程式,shell程序提供了命令列的提示符,對普通使用者用”$”作提示符,超級使用者用”#”作提示符。一旦出現shell提示符,就可以鍵入命令名稱及命令需要的引數,shell將執行這些命令,如果命令花費太長時間執行,或螢幕產生大量輸出,可以鍵入ctrl+c發出中斷訊號中斷。 shell的模擬 執行時,程式會先進入一個死迴圈,直至使用者輸出exit時停止迴圈。死迴圈內,先用一個PutFlag()函式為程式輸入命令列提示符 在這裡插入圖片描述

getpwuid()函式是通過使用者的uid查詢使用者的passwd資料,如果出錯,都返回一個空指標並設定errno的值,使用者可以根據perror函式查看出錯資訊,utsname結構體則用來獲取系統的資訊,當命令列提示符列印後,用fflush沖刷掉標準輸出上的內容(stdout)。 在這裡插入圖片描述 然後是接收鍵入的命令,由於fegts()函式會把鍵入的enter鍵收入到末尾,所以要手動把接收的命令最後一個元素置空。當命令輸入完畢,對使用者輸入的命令做簡單的解析,就是把包含命令的字串分割成一個個單獨的命令,strtok()函式會將cmd分割成以” ”為分隔符的字串,再次呼叫時要將cmd設成NULL。 在這裡插入圖片描述 在這裡插入圖片描述
執行命令前,用fork()建立子程序,在子程序呼叫execv()函式替換程式,執行鍵入的命令,失敗時退出,當父程序呼叫wait(),程序立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到一個已經變成殭屍程序的子程序,wait就會手機這個子程序的資訊,並把它稱帝銷燬後返回,如果沒有找到這樣一個子程序,wait就會一直阻塞在這樣裡,知道有一個出現為止,wait(NULL)如果成功,返回被收集的子程序的ID,如果呼叫程序沒有子程序,呼叫失敗,返回-1,同時errno被設定為ECHILD。