實現乙個簡單的shell(2)

2021-08-20 09:52:10 字數 2452 閱讀 5233

tomorrow 星辰

部落格。這是本部落格的第乙個文章**。主要介紹如何用 c 語言基於linux

系統來實現乙個簡單shell

,diy 乙個shell

。通過自己程式設計實現乙個linux

下的shell,可以使得個人對程序的概念、程序的通訊和作業系統的執行的理解更加的深刻。還會大大增加個人學習的成就感,提供學習興趣。

這乙個文章**被命名為 stupidshell ,這也是作者所實現的shell

這是 stupidshell **本章裡的第二篇文章,主要介紹內建命令和外部命令,以及外部命令的實現方法。

內部命令實際上是shell程式本身的一部分,通常都是一些比較簡單的系統命令。這些命令所實現的功能與所做工作都是由shell程式本身來完成的,也就是在 shell 程式的原始碼裡面實現的,其執行速度要比外部命令快很多,因為執行內部命令時,shell 無需建立新的程序產生多餘的開銷。常見的外部命令有:

1

2

3

exit

cd

echo

外部命令區別於內建命令,通常是一些功能較為強大、複雜的命令。它由 shell 分析然後通過linux

核心 api 建立新的程序,在新的程序中執行,在新的程序中所執行的**是不屬於 shell 的,所以在 shell 載入時並不隨之一起被載入到記憶體中,而是在外部命令執行時才將其調入記憶體中。

例如,命令 ls ,它是乙個列出當前工作目錄下所有檔案和資料夾的命令,但是實際上 ls 本身就是乙個可執行二級制程式檔案,通常存放在系統的/bin 資料夾下。shell 在執行該命令時是先建立乙個新的子程序,然後把 ls 的可執行二級制程式檔案載入到記憶體當中執行。常見的linux

下 shell 外部命令有:

1

2

3

4

ls

cat

more

grep

外部命令在被呼叫時通常是通過linux

作業系統所提供的 exe 函式族來完成的。exec 函式族的作用是根據指定的檔名和相關引數找到可執行檔案,並用它來取代當前程序的內容。換句話說,就是在呼叫程序內部執行乙個可執行檔案。這裡的可執行檔案既可以是二進位制檔案,也可以是任何linux下可執行的指令碼檔案。

exe 函式族有以下函式:

1

2

3

4

5

6

intexecl(constchar*path,constchar*arg, ...);

intexeclp(constchar*file,constchar*arg, ...);

intexecle(constchar*path,constchar*arg, ...,char*constenvp);

intexecv(constchar*path,char*constargv);

intexecvp(constchar*file,char*constargv);

intexecve(constchar*path,char*constargv,char*constenvp);

tomorrow 星辰

部落格。

實現乙個簡單的shell

shell 命令列直譯器,是一段程式,獲取標準輸入,進行解析,得到使用者想要執行的shell命令程式名稱,以及執行引數,然後執行這個指定的程式,將引數賦予其中。shell編寫思路 include include include include include intmain fgets buf,10...

編寫自己的shell(2)

指令碼中除了命令之外還包括以下元素 變數,使用者輸入,控制流,環境變數。上一次用fork,execvp,wait實現了乙個能夠建立程序和執行程式的shell。此次對這個shell做一些改進。加入命令列解析,這樣使用者可以在一行中輸入命令和所有引數了,然後將控制語句if.then加入到這個shell中...

編寫乙個簡單的shell

include include include include include include include include void getloginname void gethostname void getdir p printf s p int main char argv 32 char...