exec函式族的使用

2021-06-19 14:17:25 字數 2040 閱讀 6994

exec函式族的使用

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。

下面來看下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函式族裝入並執行程式pathname,並將引數arg0(arg1,arg2,argv,envp)傳遞給子程式,出錯返回-1。在exec函式族中,字尾l、v、p、e新增到exec後,所指定的函式將具有某種操作能力有字尾:

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。

l:引數傳遞為逐個列舉方式:execl  execle  execlp

v:引數傳遞為構造指標陣列方式: execv  execve  execvp

e:可傳遞新程序環境變數: execle  execve

p:可執行檔案查詢方式為檔名: execlp  execvp

在父程序中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)結束,最後乙個引數則為傳遞給執行檔案的新環境變數陣列。

#include

main();

char *envp=

execve(

"/bin/ls"

, argv, envp);}

執行結果為:-rw-r--r-- 1 root root 1659 feb 27 20:13 /etc/passwd

這與在bin目錄下執行 ls -al /etc/passwd 所得到的結果是一樣的。

exec函式族的使用

呼叫shell指令碼命令 execlp sh sh filename char 0 exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣...

exec函式族的使用

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include int execl const char...

exec族函式配合fork函式使用

檔案demo.c include include include include include include include intmain if pid 0 else return0 檔案changdata.c include include include include include i...