一.項目簡介
本項目旨在實現一個簡易的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] = ' 伊人久久五月天| 国产精品成人99久久久久 | 亚洲午夜久久久久妓女影院| 婷婷久久综合| 久久人妻少妇嫩草AV无码专区| 国产一区二区三区久久| 久久无码中文字幕东京热| 无码国内精品久久人妻| 99久久精品国产一区二区蜜芽| 日韩精品久久久久久久电影| 国产午夜免费高清久久影院| 一级a性色生活片久久无| 99久久久精品免费观看国产| 无码乱码观看精品久久| 99久久中文字幕| 亚洲综合伊人久久大杳蕉| 国产高潮国产高潮久久久91| 7777久久久国产精品消防器材| 99久久夜色精品国产网站| 综合人妻久久一区二区精品| 国产午夜精品理论片久久| 97精品伊人久久大香线蕉app| 国产精品久久久久蜜芽| 国产精品欧美亚洲韩国日本久久 | 久久精品亚洲欧美日韩久久| 久久精品毛片免费观看| 久久精品无码一区二区WWW| 久久精品国产亚洲7777| 99热成人精品免费久久| 99麻豆久久久国产精品免费| 久久久久亚洲精品无码蜜桃| 日韩精品久久无码人妻中文字幕| 久久中文字幕人妻熟av女| 亚洲?V乱码久久精品蜜桃| 久久久久国产一区二区| 久久黄色视频| 亚洲一级Av无码毛片久久精品| 三级韩国一区久久二区综合| 日韩十八禁一区二区久久| 思思久久99热只有频精品66| 噜噜噜色噜噜噜久久|