【Linux】實現一個簡易的shell命令行

一.項目簡介

本項目旨在實現一個簡易的linux shell命令行。我們將通過逐步分析和實現來構建這個shell,使其能夠執行基本的命令行操作。

二.分析項目實現

【Linux】實現一個簡易的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|
噜噜噜色噜噜噜久久|