乙個程式如何執行另乙個程式
答案:呼叫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 ...