【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] = '

精品人妻伦九区久久AAA片69|
99久久综合狠狠综合久久止|
久久93精品国产91久久综合|
久久这里有精品视频|
久久男人Av资源网站无码软件|
亚洲国产精品热久久|
久久久无码精品亚洲日韩京东传媒|
伊人久久大香线蕉成人|
91久久精品视频|
狠狠色丁香久久婷婷综合_中
|
久久婷婷五月综合97色直播|
亚洲AV无码久久精品色欲|
久久久久久一区国产精品|
一本大道久久a久久精品综合|
无码8090精品久久一区|
亚洲综合精品香蕉久久网97|
久久99久久99精品免视看动漫
|
久久伊人影视|
久久久中文字幕|
99久久精品国产高清一区二区|
A级毛片无码久久精品免费|
久久精品国产精品国产精品污
|
国产精品久久久久久福利69堂|
伊人久久无码精品中文字幕|
九九精品久久久久久噜噜|
欧美精品一本久久男人的天堂|
中文国产成人精品久久不卡|
久久精品国产亚洲AV忘忧草18|
国产成人香蕉久久久久|
国产精品99久久99久久久|
青草影院天堂男人久久|
久久久久女人精品毛片|
一本一道久久综合狠狠老|
久久亚洲国产成人影院|
一本大道久久香蕉成人网|
久久久免费观成人影院|
久久高清一级毛片|
久久乐国产精品亚洲综合|
精品国产91久久久久久久a|
九九久久精品无码专区|
久久影院亚洲一区|