專案 仿寫bash程式

2021-10-08 18:57:32 字數 1873 閱讀 1606

專案目標:在linux平台下仿寫一些命令的實現

1.輸出提示符資訊,類似於[stu@host desktop]$

2.等待使用者輸入命令

3.完成簡單的解析:沒輸入命令情況(直接敲回車),輸入內建命令的情況(cd exit...),輸入外接命令的情況(ls...)

**的總體框架就是這樣的

要想實現上述功能我們要清楚linux系統中命令的存放位置已經分類標準

我們在終端上檢視一下:

如果是內建命令:需要把命令整合到bash程式中。實現內建命令只要呼叫bash中的方法

如果是外接命令:linux的外接命令儲存在/bin目錄下,都是單獨實現,就像上方的ps一樣他是獨自產生了乙個新的程序,而不是作為在bash程序中統一實現。但它不是和bash沒有一點關係,大家注意一下上方的pid和ppid,ps-ef的父程序的pid就是bash的pid,所以ps-ef這個程序是bash建立的。所以實現邏輯就是這樣:

while(1)

1.建立程序:

2.子程序通過執行exec替換成使用者輸入的命令對應程式。//因為我們輸入的是ps -f,然後就找到對應命令進行替換

3.父程序等待命令執行結束——前台執行(wait防止僵死程序)

4.父程序繼續輸出提示資訊,接受使用者輸入新命令————後台執行(wait防止僵死程序)

#include#include#include#include#include#define cmdlen 128//輸入命令到最大長度

#define num 20//引數到個數

//列印提示資訊

//提示資訊組成:[使用者名稱@主機名 當前工作目錄]識別符號

void printinfo()

//切割命令,引數.分別儲存到指標陣列中

void cutcommand(char*cmd,char *cmdarr)

//實現cd命令

void mycdcommand()

void dealexec()

//實現外接命令

void dealexec(char* cmdarr)

else//父程序,分前後臺

}int main()

; fgets(cmd,127,stdin);//把輸入到資訊放到cmd中,包含最後到回車符

if(strlen(cmd)==0)//輸入為空

cmd[strlen(cmd)-1]=0;//把回車符置0;

//命令與引數分割 比如 ls -a -l -i

// 0 1 2 3

char *cmdarr[num]=;

cutcommand(cmd,cmdarr);//切割後把引數放入對應到下標

//3.對面臨進行區分: 輸入內建命令 輸入外接命令

if(strlen(cmdarr[0])==2 && strncmp(cmdarr[0],"cd",2)==0)//說明輸入的命令是cd,也就是內建命令

else if(strlen(cmdarr[0])==4 && strncmp(cmdarr[0],"exit",4)==0)//輸入的是內建命令exit

else//就是外接命令}}

Linux專案 仿寫bash程式

include include include include include include include include include define num 20 define length 128 char oldpwd length 儲存上一次的工作路徑 輸出提示符 void print...

STL小結 仿寫TinySTL專案有感

六大元件 容器 類模板 演算法 函式模板 迭代器 類模板,設計模式 配置器 類模板 配接器 容器介面卡 函式配接器 仿函式 類或類模板 整個專案採用大多的是泛型程式設計的思想 模板機制 使得多種資料型別在同乙個演算法或結構上都可以操作,在編譯器就確定聚類資料型別。一 配置器 一般new都是要先申請空...

JokeClient Swift 仿寫學習

在init關鍵字後面新增問號 init?可失敗構造器會建立乙個型別為自身型別的可選型別的物件。你通過return nil語句來表明可失敗構造器在何種情況下應該 失敗 struct animal self.species species 1 從派生類轉換為基類,向上轉型 upcasts class a...