用fock實現簡易shell(程式替換)

2021-08-19 03:39:06 字數 2173 閱讀 4019

fork之後就會建立則程序,資料、堆、棧有兩份,**仍然為乙份但是這個**段成為兩個程序的共享**段都從fork函式中返回,當父子程序有乙個想要修改資料或者堆疊時,兩個進**正**子程序在建立的時候會複製父程序的**。

不管是共用**還是複製**,這就相當於父程序建立了乙個和自己功能完全相同的程序,這樣一來,子程序就只能進行和父程序一樣的操作動作,這樣做實際意義並不大,那怎麼讓子程序幹和父程序不一樣的事情?

程式替換:子程式通常呼叫exec函式,替換掉該程序的使用者空間**和資料,從新程式的啟動歷程開始執行,exec函式並不是建立程序,所以exec之後,程序的id並未改變

exec系列函式

需要標頭檔案  #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 execvpe(const char *file, char *const argv, char *const envp);

l(list):表示採用列表

v(vector):引數用陣列

p(path):自動搜尋環境變數

e(env):自己維護的環境變數

集體操作看下面**

#include#includeint main()

; char* const envp = ;

execl("/bin/ps", "ps", "-ef", null);

//帶p可以使用環境變數path,無需路徑

execlp("ps", "ps", "-ef", null);

//帶e需要自己組裝環境變數

execle("ps", "ps", "-ef", null, envp);

execv("/bin/ps", argv);

execvp("ps", argv);

execve("/bin/ps", argv, envp);

exit(0);

}

這個程式只需要執行乙個上述 exec 函式,就可將這段**生成的可執行程式程式設計ps -ef 這條命令,上述**只有乙個程序,換成兩個程序,基本操作也是一樣的,如下面**,實現最簡shell:

#include#include#include#include#includechar *strs[128] = {};

int argc = 0;

void stok(char *buf, const char *ch)

char *token = strtok(buf, ch);

strs[argc] = token;

while((token = strtok(null, ch)) != null)

strs[argc+1] = null;

}int main()

; while(1)

else}}

return 0;

}

在這段**中,子程式的**被替換,父程序呼叫waitpid阻塞式等待子程序返回,子程序返回之後**子程序的資源,while迴圈中使用fork,建立子程序,然後在子程序中讀取鍵盤上的輸入,並將讀進的字元在串在空格處打斷,並在每個子串的最後加上\0,讓strs陣列中的每個指標都依次指向這些子串,完成之後在strs最後乙個元素的後面加上乙個空指標,這樣做的是為了滿足execvp的格式要求,然後呼叫execvp進行程式替換,替換完完畢之後子程式退出,父程序會受到子程序的資源,然後進入下一次迴圈。

scanf("%[^\n]%*c", buf);
使用snanf是最後的回車也會被輸入,上面這句**的意思是:當敲下回車時,這個回車會被遮蔽掉,也可寫為:

fgets(buf,sizeof(buf),stdin);

buf[strlen(buf)-1]=0;

簡易shell的實現

自主minishell實現 1 獲取標準輸入 2 解析輸入得到 命令名 執行引數 3 建立子程序 子程序中進行程式替換 4 程序等待 include include include include include intmain printf uesr localhost fflush stdout...

簡易shell的實現

編寫乙個簡易shell,需要迴圈以下流程 獲取命令列 解析命令列 建立乙個子程序 fork 替換子程序 execvp 父程序等待子程序退出 wait 實現 include include include include include include intmain fgets buf,1024 s...

Shell,我的簡易實現!

基礎知識 shell 是一種基本的使用者操作介面,通過對使用者輸入命令的解析完成相應的功能。shell 程式的執行包括 列印提示符 獲取命令列 解析命令 搜尋相應命令檔案 準備引數 執行命令 後台執行的程序 一般執行命令的時候,fork 乙個子程序去執行命令,父程序等待子程序完成任務。但是後台程序執...