exec函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程序的內容,換句話說,就是在呼叫程序內部執行乙個可執行檔案。這裡的可執行檔案既可以是二進位制檔案,也可以是任何
linux
下可執行的指令碼檔案。
與一般情況不同,exec函式族的函式執行成功後不會返回,因為呼叫程序的實體,包括**段,資料段和堆疊等都已經被新的內容取代,
只有呼叫失敗了,它們才會返回乙個-1,從原程式的呼叫點接著往下執行。
下面來看下exec函式族:
#include
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp);
int execv(const char *path, char *const argv);
int execvp(const char *file, char *const argv);
int execve(const char *path, char *const argv, char *const envp);
exec函式族使用區別
查詢方式
表中的前四個函式的查詢方式都是完整的檔案目錄路徑,而最後兩個函式(以p結尾的函式)可以只給出檔名,系統就會自動從環境變數「$path」所指出的路徑中進行查詢。
引數傳遞方式
兩種方式:逐個列舉、將所有引數整體構造指標陣列傳遞
以函式名的第五位字母來區分的,字母為「l」(list)的表示逐個列舉的方式,其語法為char *arg;字母為「v」(vertor)的表示將所有引數整體構造指標陣列傳遞,其語法為*const argv
環境變數
exec函式族可以預設系統的環境變數,也可以傳入指定的環境變數。這裡,以「e」(enviromen)結尾的兩個函式execle、execve就可以在envp中指定當前程序所使用的環境變數
exec函式執行失敗,常見原因:
找不到檔案或路徑,此時errno被設定為enoent;
陣列argv和envp忘記用null結束,此時errno被設定為efault;
沒有對應可執行檔案的執行許可權,此時errno被設定為eacces。
在父程序中fork乙個子程序,在子程序中呼叫
exec
函式啟動新的程式。
exec
函式一共有六個,其中
execve
為核心級系統呼叫,其他(
execl
,execle
,execlp
,execv
,execvp
)都是呼叫
execve
的庫函式。
#include
函式定義int execve(const char *filename, char *const argv[ ], char *const envp[ ]);
返回值函式執行成功時沒有返回值,執行失敗時的返回值為
-1.函式說明execve()用來執行引數
filename
字串所代表的檔案路徑,第二個引數是利用陣列指標來傳遞給執行檔案,並且需要以空指標
(null)
結束,最後乙個引數則為傳遞給執行檔案的新環境變數陣列。
Linux 程序 exec函式族
其他exec 函式 練習拓展dup2 dup to 函式 一 exec的簡介 1.fork建立程序後執行的是和父程序相同的程式 但有可能執行不同的 分支 子程序往往要呼叫一種exec函式執行另一種程式。當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,從新程式的啟動例程開始執...
Linux程序 exec族函式
1 為什麼要使用exec族函式 當我們fork乙個子程序就是為了執行乙個新的程式,此時可以呼叫exec族函式,執行已經編譯好的可執行程式或者linux自帶的ls cd等命令。2 exec族函式如何使用 函式原型 include extern char environ intexecl const c...
Linux之exec函式族
fork函式建立子程序後執行的是和父程序相同的程式 但有可能執行不同的 分支 子程序往往要呼叫一種exec函式以執行另乙個函式。當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫exec並不建立新程序,所以呼叫exec前後該程序的id並沒改變 ...