shell本質上就是將程序程式替換
替換原理:
用fork建立子程序後執行的是和父程序相同的程式(但有可能執行不同的**分支),子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序的使用者空間**和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫exec並不建立新程序,所以呼叫exec前後該程序的id並未改變。
替換函式:
有六種以exec開頭的函式,同稱exec函式:
函式說明:(1)這些函式如果呼叫成功則載入新的程式從啟動**開始執行,不再返回。#include
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);
(2)如果呼叫出錯則返回-1。
(3)所以exec函式只有出錯的返回值而沒有成功的返回值。
命名規律:
(1)l(list): 表示引數列表
(2)v(vector) : 引數用陣列
(3)p(path):有p自動搜尋環境變數path
(4)e(env) : 表示自己維護環境變數
簡單shell的實現:
shell從使用者讀入字串「ls」,shell建立乙個新的程序,然後在那個程序中執行ls程式並等待那個程序結束。
所以要寫乙個shell,需要迴圈以下過程:
(1)獲取命令列
(2)解析命令列
(3)建立乙個子程序(fork)
(4)替換子程序(execvp)
(5)父程序等待子程序退出(wait)
【myshell.c】
執行結果:#include
#include
#include
#include
#include
char* argv[8];
int argc=0;
void do_parse(char *buf)
else
if(isspace(buf[i]))
}argv[argc]=null;
}void do_execute()
}}int main()
; while(1)
return
0;}
[lize-h@localhost 0408_forkcontrol]$ ./a.out
myshell>ls
a.out block_wait.c createfork.c cre_vfork.c exit_fork.c myshell.c not_block_wait.c wait wait_fork.c
myshell>ls -1
a.out
block_wait.c
createfork.c
cre_vfork.c
exit_fork.c
myshell.c
not_block_wait.c
wait
wait_fork.c
myshell>touch shellll.c
myshell>ls
a.out block_wait.c createfork.c cre_vfork.c exit_fork.c myshell.c not_block_wait.c shellll.c wait wait_fork.c
myshell>rm shellll.c
myshell>ls
a.out block_wait.c createfork.c cre_vfork.c exit_fork.c myshell.c not_block_wait.c wait wait_fork.c
myshell>
自己動手製作乙個簡易的shell
本人最近在看 unix環境高階編層 其上面的程式清單1 5的程式介紹了如何製作乙個shell,而後本人又做了一點改進,改進的地方如下 1.為了方便檢視,刪除了原來的err sys 函式和其自定義的 apue.h 這個標頭檔案!2.增加了對於命令選項處理的功能,但是不是很強大,目前只能處理單個引數!本...
Linux下實現乙個簡易的shell指令碼
在linux系統下我們都是通過在命令列敲擊一些命令來實現一些我們想要的操作,只要了解一些程序程式替換的知識,我們也可以自己寫乙個簡易的shell。什麼是shell 指令碼 最簡單的解釋,乙個shell 指令碼就是乙個包含一系列命令的檔案。shell 讀取這個檔案,然後執行檔案中的所有命令,就好像這些...
乙個Linux中用於監控的簡易shell指令碼
系統管理員的任務真的很艱難,因為他 她必須監控伺服器 使用者 日誌,還得建立備份,等等等等。對於大多數重複性的任務,大多數管理員都會寫乙個自動化指令碼來日復一日地重複這些任務。這裡,我們已經寫了乙個shell指令碼給大家,用來自動化完成系統管理員所要完成的常規任務,這可能在多數情況下,尤其是對於新手...