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