程序替換和exec函式族

2021-08-16 17:41:18 字數 1615 閱讀 1995

fork 建立的子程序一般不會執行和父程序相同的**段,而是呼叫exec相關函式,將該程序的使用者空間**和資料完全替換,子程序從替換的新程式啟動執行。exec僅僅是替換**和資料,並不會建立新程序,所以被替換的程序 id 和子程序 id 相等。

如下圖:

新程序從呼叫程序繼承了下列屬性:

exec函式族 函式

引數格式

是否帶路徑

是否使用當前環境變數

int execl(const char * path,const char * arg, …);

list不帶是

int execlp(const char * file,const char * arg, …);

list帶是

int execle(const char * path,const char * arg, … char const *envp);

list

不帶需自己組裝環境變數

int execv(const char * path,char* const argv);

array不帶是

int execvp(const char * file,char* const argv);

array帶是

int execve(const char * path,char* const argv, char const *envp);

array

不帶需自己組裝環境變數

引數:

返回值:

替換成功,則從新程序開始執行,不會返回,失敗返回-1,;所以該函式只要返回,就說明程序替換失敗。

事實上這些函式最終都調了系統呼叫execve, 如下圖:

看下面這個例子:

hello.c

#include 

int main(int argc, char *argv, char *env)

int j = 0;

while(env[j])

return

0;}

exec.c

#include 

#include

#include

extern

char **environ;

int main()

; char* const env = ;

execve(path, arg, env);

return

0;}

執行結果:

可以看到,列印出的引數正是我們傳過去的引數,而環境變數也是如此。

——完!

程序 exec函式族

一 exec函式族 通過呼叫exec函式族實現讓父子程序執行不同的程式,父程序不會受影響。exec函式族,就是以exec為開頭的函式,比如execl函式 execlp函式等,所以稱它為exec函式族。l list 命令列引數列表 p path 搜尋file時的使用的path變數 v vector向量...

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