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
int
execl(
const
char
*path,
const
char
*arg, ...);
int
execlp(
const
char
*file,
const
char
*arg, ...);
int
execle(
const
char
*path,
const
char
*arg, ...,
char
*
const
envp);
int
execv(
const
char
*path,
char
*
const
argv);
int
execvp(
const
char
*file,
char
*
const
argv);
int
execve(
const
char
*path,
char
*
const
argv,
char
*
const
envp);
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...