在CLUI(Command Line User Interface捌显,與GUI對應(yīng))模式下茁彭,用戶是通過shell與系統(tǒng)交互的。shell也是一個程序扶歪,它與其他程序最大的不同是:它的目的是執(zhí)行其他程序理肺,而不是從事計算,繪圖,存儲等等具體事務(wù)妹萨。分析一下shell的工作原理有助于破除shell的神秘感年枕,更好的掌握shell命令挣菲。下圖是shell的基本流程迂猴,現(xiàn)在流行的bash,csh嗤疯,zsh等要比這復(fù)雜得多树姨,考慮了很多細節(jié)摩桶。
img
上圖展示了ls命令的執(zhí)行過程,下面進行簡單分析:
- 1帽揪、shell不斷詢問是否有鍵盤輸入典格,用戶以enter結(jié)束鍵盤輸入后,shell程序以空格為分隔符台丛,得到"ls"耍缴,"-l","*.c"挽霉,三個字符串防嗡。
- 2、shell發(fā)現(xiàn)第三個字符串包含"*"通配符侠坎,就會在當前路徑(或指定路徑)下搜索滿足這個通配符的文件蚁趁。有bar.c和foo.c兩個文件,然后展開成{"ls"实胸,"-l"他嫡,"bar.c","foo.c"}四個字符串庐完,并保存在argv這個二維字符數(shù)組中钢属,并賦值argc為4。
- 3门躯、shell然后搜索PATH這個全局變量保存的路徑淆党,尋找一個叫"ls"的命令。如果存在讶凉,則fork()一個子進程染乌,調(diào)用exec()加載運行l(wèi)s命令。ls的main(int argc, string ** argv)函數(shù)的參數(shù)就是從shell那里得來的懂讯。若不存在就會提示用戶"command not found"荷憋。
- 4、ls程序執(zhí)行后褐望,會分析argc和argv勒庄,"-l"表示這是一個選項開關(guān)串前,表明用戶想得到文件的詳細信息,并把這個開關(guān)量保存锅铅,以便最后輸出的時候選擇信息的格式。
- 5减宣、ls執(zhí)行完既定的步驟后盐须,退出并返回退出碼,若成功則返回0漆腌,否則根據(jù)錯誤的不同返回不同的非零數(shù)字贼邓。
- 6、shell在得到成功退出碼后闷尿,繼續(xù)等待用戶輸入塑径。
如此不斷的循環(huán)。
轉(zhuǎn):http://blog.csdn.net/hjx5200/article/details/22487683