一.項目簡介
本項目旨在實現一個簡易的linux shell命令行。我們將通過逐步分析和實現來構建這個shell,使其能夠執行基本的命令行操作。
二.分析項目實現
實現一個shell需要循環以下過程:
- 獲取命令行
- 解析命令行
- 建立一個子進程(fork)
- 替換子進程(execvp)
- 父進程等待子進程退出(wait)
三.逐步實現項目功能
1.獲取命令行
我們將獲取命令行設計為一個循環,除非用戶主動退出,否則一直保持命令行接收指令的狀態。具體實現邏輯如下:
int main(){ while(!quit){ // 2.交互問題,獲取命令行內容 interact(commandline, sizeof(commandline)); <pre class="brush:php;toolbar:false"> // 3.分割命令字符串strtok(),解析命令行 int argc = splitstring(commandline, argv); if(argc == 0) continue; // 4.指令的判斷 int n = buildCommand(argv, argc); // 5.普通命令的執行 if(!n) NormalExcute(argv); } return 0;
}
具體的獲取命令行邏輯如下函數:
const char* getusername(){ // 通過getenv()獲取環境變量中的用戶名 return getenv("USER"); }</p><p>void getpwd(){ // 通過getcwd系統接口獲取并更新pwd getcwd(pwd, sizeof(pwd)); }</p><p>void interact(char *cline, int size){ // 需要環境變量相關的系統調用函數來獲取命令行提示信息 // 獲取主機名 char hostname[64]; gethostname(hostname, sizeof(hostname));</p><pre class="brush:php;toolbar:false">// 1.打印bash命令行前面的提示信息 getpwd(); printf(LEFT"%s@%s %s"RIGHT""LABLE" ", getusername(), hostname, pwd); // 2.接收用戶輸入信息 fgets(cline, size, stdin); assert(cline != NULL); (void)cline; // 防止編譯器報錯定義而未使用的變量(假裝用一下) cline[strlen(cline)-1] = ' 精品人妻伦九区久久AAA片69| 99久久综合狠狠综合久久止| 久久93精品国产91久久综合| 久久这里有精品视频| 久久男人Av资源网站无码软件| 亚洲国产精品热久久| 久久久无码精品亚洲日韩京东传媒| 伊人久久大香线蕉成人| 91久久精品视频| 狠狠色丁香久久婷婷综合_中 | 久久婷婷五月综合97色直播| 亚洲AV无码久久精品色欲| 久久久久久一区国产精品| 一本大道久久a久久精品综合| 无码8090精品久久一区| 亚洲综合精品香蕉久久网97| 久久99久久99精品免视看动漫 | 久久伊人影视| 久久久中文字幕| 99久久精品国产高清一区二区| A级毛片无码久久精品免费| 久久精品国产精品国产精品污 | 国产精品久久久久久福利69堂| 伊人久久无码精品中文字幕| 九九精品久久久久久噜噜| 欧美精品一本久久男人的天堂| 中文国产成人精品久久不卡| 久久精品国产亚洲AV忘忧草18| 国产成人香蕉久久久久| 国产精品99久久99久久久| 青草影院天堂男人久久| 久久久久女人精品毛片| 一本一道久久综合狠狠老| 久久亚洲国产成人影院| 一本大道久久香蕉成人网| 久久久免费观成人影院| 久久高清一级毛片| 久久乐国产精品亚洲综合| 精品国产91久久久久久久a| 九九久久精品无码专区| 久久影院亚洲一区|