(一)exec函式族
通過呼叫exec函式族實現讓父子程序執行不同的程式,父程序不會受影響。
exec函式族,就是以exec為開頭的函式,比如execl函式、execlp函式等,所以稱它為exec函式族。
l(list) :命令列引數列表
p(path) :搜尋file時的使用的path變數
v(vector向量,載體):使用命令列引數陣列
e(environment) :使用環境變數陣列
注:(1)在exec函式族中,一般fork建立子程序後,執行的是和父程序相同的程式,只是父子程序執行了不同的**分支而已。子程序往往通過呼叫任意乙個exec函式來執行另外乙個程式,當子程序呼叫一種exec函式時,該子程序的使用者空間**和資料完全被新程式替換,並從新程式開始執行。但是呼叫的exec程式並不會建立新程序,所以呼叫exec前後該程序的id並未改變。
(2)exec函式族只是用磁碟上的乙個新程式替換了當前程序的正文段、資料段、堆疊和棧段。
(二)execl/execlp
(1)execl()中的字尾"l"代表list,也就是引數列表的意思。int execl(const char *path, const char *arg, ...,**null**);
eg: execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);//null
第一引數path字元指標所指向要執行的檔案路徑(絕對路徑), 接下來的引數代表執行該檔案時傳遞的引數列表:ar**[0],ar**[1]… ,最後乙個引數須用空指標null作結束。
(1)execlp()函式:會從path 環境變數所指的目錄中,查詢符合引數file的檔名, 並執行該檔案。然後將第二個以後的引數當做該檔案的傳參ar**[0]、ar**[1]……, 最後乙個引數必須用空指標(null)作結束。int execlp(const char * file,const char * arg,……, null);
eg: execlp(「ls」, 」ls」,」-al」, 」/etc/passwd」, (char *)0);//null
(2)返回值: 如果執行成功則函式不會返回,執行指定的程式,
執行失敗則直接返回-1, 失敗原因存於errno 中。
(三)execv/execvp
int execv(const char *pathname, char * const ar**);
注:
(1)成功執行指定的程式,失敗返回eof
(2)ar**封裝成指標陣列的形式
(四) systemeg:
·char * ar**[ ] = ;
if (execv("/bin/ls", ar**) == -1)
int execvp(const char *file ,char * const ar** );
eg: char * ar**[ ] =;
execvp(「ls」,ar**);
int system(char *command);
功 能:可以不替換,執行後面的程式。
實 質:fork了乙個子程序去執行封裝的exec函式
當前程序等待command執行結束後才繼續執行
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...
程序替換和exec函式族
fork 建立的子程序一般不會執行和父程序相同的 段,而是呼叫exec相關函式,將該程序的使用者空間 和資料完全替換,子程序從替換的新程式啟動執行。exec僅僅是替換 和資料,並不會建立新程序,所以被替換的程序 id 和子程序 id 相等。如下圖 新程序從呼叫程序繼承了下列屬性 exec函式族 函式...