本人最近了解了關於exec函式族相關的知識,在此進行一下總結。
fork函式是用於建立乙個子程序,該子程序幾乎是父程序的副本。而當我們希望子程序去執行另外的程式時,exec函式族就提供了乙個在程序中啟動另乙個程式執行的方法。它可以根據指定的檔名或目錄名找到可執行檔案(這裡的可執行檔案既可以是二進位制檔案,也可以是linux下任何可執行指令碼檔案),並用它來取代原呼叫程序的資料段、**段和堆疊段,在執行完之後,原呼叫程序的內容除了程序號外,其他全部被新程式的內容替換了。
一般而言,在linux中使用exec函式族主要有以下兩種情況:
程序認為自己不能再為系統和使用者做出任何貢獻時,就可以呼叫任何exec 函式族讓自己重生
乙個程序想執行另乙個程式,它可以呼叫fork函式新建乙個程序,然後呼叫任何乙個exec函式使子程序重生
exec函式族中並沒有exec函式,但有6個以exec開頭的成員函式,它們所需的標頭檔案均為,原型如下:
int execl(const char *path, const char *arg, ...)
int execv(const char *path, char *const argv)
int execle(const char *path, const char *arg, ..., char *const envp)
int execve(const char *path, char *const argv, char *const envp)
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv)
函式的返回值為int型別,一般而言有兩種情況:
這六個函式在函式名和使用語法的規則上都有細微的區別,下面就可執行檔案查詢方式、參數列傳遞方式及環境變數這三個方面進行比較說明。
exec函式族中前四個函式(execl、execv、execle、execve)的查詢方式都是完整的檔案目錄路徑,而最後2個函式(也就是以p結尾的兩個函式)可以只給出檔名,系統就會自動從環境變數「$path」所指出的路徑中進行查詢
exec函式族的引數傳遞有兩種方式,以函式名的第5位字母來區分:
字母為「l」(list)的表示逐個列舉的方式,最後乙個指標要求是null
字母為「v」(vector)的表示將所有引數整體構造成指標陣列傳遞,然後將該陣列的首位址當做引數傳給它,陣列中的最後乙個指標也要求是null
exec函式族使用了系統預設的環境變數,也可以傳入指定的環境變數。這裡以「e」(environment)結尾的兩個函式execle、execve就可以在envp中指定當前程序所使用的環境變數替換掉該程序繼承的所有環境變數。
總的來說,exec函式族命名關係可以歸結為:
前四位:統一為exec
第五位:
第六位:
// 引數指標陣列,以null結尾
char *const ps_argv =;
// 環境變數
char *const ps_envp =;
// 使用檔案路徑查詢
execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", null);
execv("/bin/ps", ps_argv);
// 使用檔案路徑查詢,指定新的環境變數
execle("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", null, ps_envp);
execve("/bin/ps", ps_argv, ps_envp);
// 使用檔名查詢
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", null);
execvp("ps", ps_argv);
exec函式族筆記
include extern char environ int execl const char path,const char arg,int execv const char path,char const argv int execle const char path,const char a...
exec族函式總結
1 execve為系統呼叫 其他的都是封裝的函式 l 引數列表 p 在環境變數path中尋找 v 引數陣列 e 替換環境變數列表 返回值 函式出錯 返回0 否則不反回 原來的使用者區已經被替換 只留下pcb所以沒有返回的地方 exec族函式只替換使用者區 但是對核心區的pcb也有一定的影響 詳見 a...
程序 exec函式族
一 exec函式族 通過呼叫exec函式族實現讓父子程序執行不同的程式,父程序不會受影響。exec函式族,就是以exec為開頭的函式,比如execl函式 execlp函式等,所以稱它為exec函式族。l list 命令列引數列表 p path 搜尋file時的使用的path變數 v vector向量...