shell就是運用程式替換的原理進行實現的。
何為程式替換?
假如作業系統正在執行某乙個程式,然後我們利用程式替換函式指定乙個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork乙個程序,如果fork成功,子程序會和父程序執行相同的**,而我們建立子程序是希望子程序執行指定的操作,所以需要執行exec族函式。
實現步驟:
1)採用read函式讀取標準輸入寫到顯示器上的資訊,並且返回讀取到的字元個數,如果返回值大於0,說明有讀取到字元,就將讀到的字串的最後加個字串的結束符\0;否則,結束此次迴圈。
2)將讀取到的字串按照空格分成多個字串,放進指標陣列argv中,並在指標陣列的最後加乙個null。
3)建立乙個子程序,父程序等待子程序執行完程式,子程序執行程式替換函式,關於程式替換函式的選擇:我們選擇的是execvp函式(因為我們已經知道要執行的程式的檔名,引數也已經全部儲存在argv指標陣列中)。
獲得登入資訊的關鍵函式:
shell的基本功能:
1)自動獲取使用者名稱,主機名,當前目錄;
2)可以實現連續按回車的情況;
3)按錯命令可以有刪除的功能.
**實現:
#include
#include
#include
#include
#include
#include
#include
void getloginname() //獲取登入名
void gethostname() //獲取主機名
; gethostname(name,sizeof(name)-1);
printf("%s",name);
}void getdir() //獲取當前工作目錄
; getcwd(pwd,sizeof(pwd)-1); //pwd儲存的是絕對路徑
int len=strlen(pwd);
char* p=pwd+len;
while(*p!='/'&&len--)
p++;
printf(" %s]#",p);
}void myshell()
myargv[i++]=start;
}else}}
else
myargv[i-1]=null;
pid_t id=vfork(); //fork子程序去執行輸入的命令
if(id==0)
else
printf("\n");
}}int main()
實現簡單的shell功能
首先要了解shell shell用fork建 新程序,execv函式簇在新程序中運 戶指 定的程式,最後shell wait命令等待新程序結束。wait系統調 同時從核心取得退出狀態或者訊號序號以告知 程序是如何結束的。以下就是實現了簡單的shell include include include ...
linux c實現簡單shell
簡單的模擬shell,可以執行帶乙個輸入重定向 或輸出重定向或管道 命令,程式存在不完善之處,基本能用 include include include include include include include include includechar command 100 存放命令 char ...
自主實現簡單shell的編寫
用fork建立子程序後執行的是父程序相同的程式,但實際期望中,我們希望子程序應該執行和父程序不同的 所以此時,子程序需要呼叫exec函式以執行另乙個程式,當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,並從新的程式的啟動例程開始執行。呼叫exec並不建立新程序,所以呼叫ex...