自己動手製作乙個簡易的shell

2021-06-25 21:12:52 字數 1975 閱讀 7329

本人最近在看《unix環境高階編層》,其上面的程式清單1-5的程式介紹了如何製作乙個shell,而後本人又做了一點改進,改進的地方如下:

1.為了方便檢視,刪除了原來的err_sys()函式和其自定義的"apue.h"這個標頭檔案!

2.增加了對於命令選項處理的功能,但是不是很強大,目前只能處理單個引數!

本人寫的**如下:

#include#include#include#include#include#include#define maxline 2048

int main(int argc,char *argv)

while(buf[i] == ' ') //將命令和引數之間的空格都給忽略掉

i++;

while(buf[i] != '\0') //讀取引數

i++;

}

printf("com:%s para:%s\n",com,para);

pid=fork(); //建立子程序

if(pid < 0) //建立子程序出錯

else if(pid == 0) //子程序的執行部分

if((pid = waitpid(pid,&status,0)) < 0)//父程序等待子程序結束

memset(buf,0,maxline); //重新設定buf的快取空間

printf("%%");

}return 0;

}

這個程式的思路是這樣的,

資料部分,我建立了三個char陣列,buf,com,para,分別用來儲存讀取到的字串,分析到的命令,分析到的引數!三個int型變數,i,p_l,c_l。分別用來給buf、para、com計數!

執行部分,首先通過fgets()函式將命令讀取到buf這個char陣列中。然後將com和para陣列全部初始化為0。然後,就開始分析命令。

分析過程如下:

首先,將命令開始的空格全部忽略。第二,從第乙個非空格部分到下乙個空格為命令部分,儲存到com陣列中!第三,讀取完命令之後,剩下的部分全部視為引數了,並且忽略掉其中的空格,儲存到para陣列中!

ok,這樣,分析就分析完了,開始執行!這裡的思路主要就是當前這個程序建立乙個子程序,然後將上面分析到的命令和引數傳遞給execlp()函式,讓子程序執行execlp()函式,execlp函式的主要功能是將其傳入的命令替換掉程序中的程式部分,這樣子程序執行的就是我們給execlp()函式傳遞命令和引數了!

這裡,我想講一下個人對於fork()這個函式的理解,如若有誤,還請多多指出!

如上圖所示,個人認為fork函式是乙個分水嶺,在這裡開始建立乙個子程序,子程序複製了父程序的資料和程式,這時就有兩個程序在執行中間這段**了,fork()函式給父程序返回的是子程序的pid(正常情況下,如果出錯,返回乙個小於0的值),給子程序返回的pid是0。所以父程序什麼也沒執行,直接執行到了waitpid()那裡,而子程序呢,由於其pid是0,所以執行了if(pid==0)這個條件下的**!

在if(pid == 0)中,子程序執行了execlp()函式,這個函式就是將程序中的**全部替換成其傳入命令的**,比如,如果我們給execlp傳入的是ls命令,那麼這個子程序執行的完全就是ls命令的**。

通過這樣,我們就成功的實現了乙個極其簡單的shell!以下是結果的截圖:

當然,問題還是很多的,比如執行cd ..就不行,輸出變數也不行!

最後,俺想說一句,俺能力有限,水平有限,做出這個程式實在是為了自娛自樂,有很多不足的地方,還請各位大神輕拍啊!

動手製作乙個Blog

隨著參加工作時間的不斷增長,遇到了不少的問題,也有很多想學習的新技術,這是乙個龐大的工程,但是從中能沉澱出多少,還是要靠這爛筆頭才行。之前使用過work,使用過石墨,使用過印象,使用過xmind,使用過md等等等等,但是都很零散,沒有乙個系統的分類整理,所以萌生了寫blog的想法。現在準備深入研究一...

製作乙個簡易的PHP框架

crom是結合當前各種框架和各類教程,自己整合的開發框架,框架能進行簡易的web開發。gitlab原始碼鏈結 ctrl model views core common config libimooc.php log storage vendor composer.json index.php 框架根...

自己動手程式設計實現乙個shell

這是本部落格的第乙個文章 主要介紹如何用 c 語言基於linux系統來實現乙個簡單shell,diy 乙個shell。通過自己程式設計實現乙個linux下的 shell,可以使得個人對程序的概念 程序的通訊和作業系統的執行的理解更加的深刻。還會大大增加個人學習的成就感,提供學習興趣。這乙個文章 被命...