1.exec家族一共有六個函式,分別是:
(1)int execl(const char *path, const char *arg, ......);
(2)int execle(const char *path, const char *arg, ...... , char * const envp);
(3)int execv(const char *path, char *const argv);
(4)int execve(const char *filename, char *const argv, char *const envp);
(5)int execvp(const char *file, char * const argv);
(6)int execlp(const char *file, const char *arg, ......);
其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。
exec函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程序的內容,換句話說,就是在呼叫程序內部執行乙個可執行檔案。這裡的可執行檔案既可以是二進位制檔案,也可以是任何linux下可執行的指令碼檔案。
與一般情況不同,exec函式族的函式執行成功後不會返回,因為呼叫程序的實體,包括**段,資料段和堆疊等都已經被新的內容取代,只留下程序id等一些表面上的資訊仍保持原樣,頗有些神似"三十六計"中的"金蟬脫殼"。看上去還是舊的軀殼,卻已經注入了新的靈魂。只有呼叫失敗了,它們才會返回乙個-1,從原程式的呼叫點接著往下執行。
2.它們之間的區別:
第乙個區別是:
前四個取路徑名做為引數,後兩個取檔名做為引數,如果檔名中不包含 「/」 則從path環境變數中搜尋可執行檔案, 如果找到了乙個可執行檔案,但是該檔案不是連線編輯程式產生的可執行**檔案,則當做shell指令碼處理。
第二個區別:
前兩個和最後乙個函式中都包括「 l 」這個字母 ,而另三個都包括「 v 」, " l "代表 list即表 ,而" v "代表 vector即向量,也是是前三個函式的引數都是以list的形式給出的,但最後要加乙個空指標,如果用常數0來表示空指標,則必須將它強行轉換成字元指標,否則有可能出錯。,而後三個都是以向量的形式給出,即陣列。
最後乙個區別:
與向新程式傳遞環境變數有關,如第二個和第四個以e結尾的函式,可以向函式傳遞乙個指向環境字串指標陣列的指標。即自個定義各個環境變數,而其它四個則使用程序中的環境變數。
3.例項講解:
(1)在平時的程式設計中,如果用到了exec函式族,一定記得要加錯誤判斷語句。先判斷execl的返回值,如果出錯,可以用perror( )函式列印出錯誤資訊。
如:if (execl(「path」,」..」」(char *)0) < 0)
perror(「execl error!」);
如果呼叫出錯,可輸出:execl error!: 錯誤原因 這樣可方便查詢出錯原因
(2)注意下面書寫格式:
先定義乙個指標陣列:char *argv=
用execv呼叫ls: execv(「/bin/ls」,argv)
如果用execvp
execvp(「ls」,argv) //直接寫ls就可以了
注意:execl呼叫shell 時,要在shell指令碼中指明使用的shell版本:#!/bin/bash。在命令列下執行shell指令碼,系統為它自動開啟乙個shell,在程式中沒有shell,在呼叫shell指令碼時,會出錯,所以要在shell指令碼中先開啟shell。
exec 系列函式
本質 用新的程式代替新的程序,可以指定要執行程式的檔案exec函式如下 intexecl const char path,const char arg,path 指定路徑 相對 絕對路徑 arg 相當於命令列引數,最後加上null。intexeclp const char file,const ch...
Linux 之exec系列函式
當程序呼叫exec系列函式中的任乙個時,該程序使用者空間資源 正文 資料 堆 棧 完全由新程式替代。因為呼叫exec並不建立新程式,如果無特殊指示 程序核心資訊基本不用修改 1 execl函式宣告如下 from usr include unistd.h int execl const char pa...
exec系列函式的實現
exec系列函式從linux的linux binfmt鍊錶中,通過依次呼叫每個結構的load binary函式來選擇合適的執行格式,一旦找到就執行load binary函式,否則嘗試下乙個linux binfmt的load binary 直到嘗試完所有的linux binfmt。load binar...