編寫簡單shell

2021-07-27 17:27:45 字數 2277 閱讀 6890

shell英文翻譯為外殼,殼的意思;而在linux作業系統中,我們將它作為作業系統的外殼來理解。對shell工作原理的感性認識,shell在執行指令時,看似執行指令,實際是建立了shell的子程序來代替父程序shell來執行指令,此時子程序執行指令並不是shell的指令,而是乙個全新的指令。這裡就運用了linux程序控制主題下的程序程式替換。

子程序程式替換的步驟 :1.建立子程序;2.將硬碟上的新程式載入到物理記憶體中去;3.讓子程序通過頁表對映到物理記憶體中新**的位置,從此子程序在**和資料上與父程序沒有任何關係(除血緣關係)。

linux採用exec程序程式替換家族函式來進行程式的替換,共有六個函式

函式的返回值:

這些函式如果調.用成功則載入新的程式從啟動**開始執行,不再返回,如果呼叫出錯則返回-1, 所以exec函式只有出錯的返回值.而沒有成功的返回值。

以上六個函式各有不同,主要在字尾字碼l與v、p、e的含義不同函式的引數形式也不相同

兩者不同在於第二個引數,第二個引數代表輸入命令列的引數,execl函式以l結尾,第二個引數為可變列        表的形式(...),

execv函式以v結尾,第二個引數用指標陣列來代替,陣列元素指向乙個個字串。但引數都是以          null 結尾。

函式字尾不帶p,第乙個引數必須是程式的相對路徑和絕對路徑,『.』表示當前路徑,『\』表示根目錄;函式字尾        帶p,則第乙個引數可以是程式名,也可以加/表示路徑。

函式字尾帶有e,則第三個引數表示環境變數,可以重新傳乙個新的環境變數給函式;不帶字尾e,則函式         exec使用當前的環境變數執行程式。

只有函式execve是真正系統呼叫的函式,其餘五個函式最終呼叫的都是execve函式。

簡單myshell的編寫步驟:

建立乙個子程序

在子程序中執行一條執行命令,該執行命令能夠與系統執行的結果相同

父程序等待子程序結束並**

myshell命令的編寫截圖:

myshell編寫涉及的函式:

引數:fd表示檔案描述符,buf表示讀取到的內容儲存到buf中,count表示期望讀到的位元組數。即期望從識別符號為fd的檔案中讀取到count位元組數(常用sizeof()求取)的內容放到buf中去。

返回值:

當返回值大於0,表示讀取成功,且沒有讀到檔案的尾端,返回值表示讀取到的字元個數;當返回值等於0,表示讀到檔案的結尾(當停止向檔案寫入內容,唯讀的話,一段時間之後,就會讀到檔案結尾);當返回值小於0,表示讀取失敗。

程序等待函式

引數:pid表示要等待子程序的標識,status是輸出型的引數,表示子程序的退出訊息,32位我們之關心低16位,次第八位表示子程序的退出碼,第八位表示子程序退出時收到的退出訊號。options表示父程序等待的狀態,有兩種,阻塞式等待(options置0),非阻塞式等待(options置為wnohang);

要得到退出碼與退出訊號,我們可以用移位操作(退出碼:(status>>8)&oxff  退出訊號:(status)&oxff);也可以用巨集。

wifexited(status) : 若為正常終止子程序返回的狀態,則為真。(檢視程序是否是正常退出)

wexitstatus(status) : 若wifexited非零,提取子程序退出碼。

返回值:若子程序正常退出,則返回子程序的id,否則返回-1.

linux 簡單shell指令碼編寫

前幾天學習了一些shell指令碼編寫,今天把它記下來。下面的指令碼是修改電腦的ip位址 子網掩碼 閘道器。bin bash 這句話是指定指令碼的直譯器是bash read p please input ipaddr ip read p這個語句就是通過鍵盤讓自己輸入要輸入的內容 read p plea...

自主實現簡單shell的編寫

用fork建立子程序後執行的是父程序相同的程式,但實際期望中,我們希望子程序應該執行和父程序不同的 所以此時,子程序需要呼叫exec函式以執行另乙個程式,當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,並從新的程式的啟動例程開始執行。呼叫exec並不建立新程序,所以呼叫ex...

shell的簡單編寫及執行

sell指令碼 1.新建檔案 副檔名.sh 2.寫 3.給許可權,執行 x執行,絕對路徑,相對路徑 test.sh root test.sh vim a.sh bin bash 直譯器是誰 例 vima sh bin bash hello word echo hello word chmod x a...