exec系列函式

2021-05-22 21:05:41 字數 1729 閱讀 9399

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...