實現自己的shell(一)

2021-10-25 00:01:28 字數 1348 閱讀 2727

乙個程式如何執行另乙個程式

答案:呼叫execvp

圖8.6顯示了乙個程式如何執行另乙個程式。比如,為了執行ls -la,乙個程式呼叫execvp(「ls」,arglist)。這裡arglist是命令列的字串陣列。核心從磁碟將程式載入記憶體。命令引數ls -la被傳給程式,然後程式開始執行。簡而言之:

(1)程式呼叫execvp

(2)核心從磁碟將程式載入

(3)核心將arglist複製到程序

(4)核心呼叫main(argc,ar**)

下面是執行ls -l的完整程式:

main()

execvp有兩個引數:要執行的程式名和那個程式的命令列引數陣列。當程式執行時命令列引數以ar**傳給程式。注意將陣列的第乙個元素置為程式的名稱。還要注意,最後乙個元素必須是null。

1.第二條列印的訊息**去了

再看一下**。程式宣布它要執行ls程式,執行ls程式,然後宣布ls結束。那麼第二條資訊呢?

乙個程式在乙個程序中執行——也就是一些記憶體和核心中相應的資料結構,這樣,execvp將程式從磁碟載入程序一遍他可以被執行,但是載入到哪個程序呢,這就是問題之所在,核心將新程式載入到當前程序,替代當前程序的**和資料。

2.execvp就像換腦

有人可能會有這樣的願望:「我希望用愛因斯坦的腦子解決這個問題,然後再用自己的腦子做其他的事。」一種實現這個願望的方法事拿掉你的大腦,然後裝上愛因斯坦的大腦,這樣你就擁有了他的思考和分析能力。這樣想擁有兩個思維的願望就和原來的大腦一起被拿掉了。

exec系統呼叫從當前程序中吧當前程式的機器指令清楚,然後在空的程序中載入呼叫事指定的程式**,最後執行這個新的程式,exec調整程序的記憶體分配使之適應信的程式對記憶體的要求。相同的程序,不同的內容

execvp()總結如下

execvp

目標在指定路徑中查詢並執行乙個檔案

標頭檔案#include

函式原型

result = execvp(const char* file, const char* ar**)

引數file 要執行的檔名 ar**字串陣列

返回值-1 如果出錯

execvp載入由file指定的程式到當前程序,然後試圖執行它,execvp將以null結尾的字串列表傳給程式,execvp在環境變數path所知的那個的路徑中查詢file檔案。

如果執行成功,execvp沒有返回值,當前程式從程序中清除,新的程式在當前程序中執行

實現自己的shell框架

include 系統基本資料型別 include waitpid include execvp while 1 else 1 為什麼要fork乙個子程序來實現,直接while迴圈不可以嗎?因為一旦執行execvp 當前程序就會被execvp的程序所替代,執行完後就會結束程式,所以while迴圈是不可...

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

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

自己常用的一些Shell命令

系統常用命令 passwd hostname 修改密碼 useradd hostname 新增使用者 su 切換到root使用者 ssh hostname ssh連線 cd directory 進入到directory目錄 sudo chown username 給使用者賦相應許可權 ctrl c ...