Linux 檔案 Exe函式族

2021-07-23 23:19:07 字數 1773 閱讀 5410

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並沒改變 ...