Linux系統程式設計 程序替換 exec 函式族

2021-09-07 12:03:56 字數 3665 閱讀 6175

在 windows 平台下。我們能夠通過雙擊執行可執行程式。讓這個可執行程式成為乙個程序;而在 linux 平台。我們能夠通過./執行,讓乙個可執行程式成為乙個程序。

可是,假設我們本來就執行著乙個程式(程序),我們怎樣在這個程序內部啟動乙個外部程式。由核心將這個外部程式讀入記憶體,使其執行起來成為乙個程序呢?這裡我們通過 exec 函式族實現。

exec 函式族。顧名思義。就是一簇函式,在 linux 中,並不存在 exec() 函式。exec 指的是一組函式。一共同擁有 6 個:

[cpp]view plain

copy

#include 

intexecl(

const

char

*path, 

const

char

*arg, ...);  

intexeclp(

const

char

*file, 

const

char

*arg, ...);  

intexecle(

const

char

*path, 

const

char

*arg, ..., 

char

* const

envp);  

intexecv(

const

char

*path, 

char

*const

ar**);  

intexecvp(

const

char

*file, 

char

*const

ar**);  

intexecve(

const

char

*path, 

char

*const

ar**, 

char

*const

envp);  

當中僅僅有 execve() 是真正意義上的系統呼叫,其他都是在此基礎上經過包裝的庫函式。

exec 函式族提供了六種在程序中啟動還有乙個程式的方法。exec 函式族的作用是依據指定的檔名稱或資料夾名找到可執行檔案,並用它來代替呼叫程序的內容,換句話說,就是在呼叫程序內部執行乙個可執行檔案。

程序呼叫一種 exec 函式時,該程序全然由新程式替換。而新程式則從其 main 函式開始執行。

由於呼叫 exec 並不建立新程序,所以前後的程序 id (當然還有父程序號、程序組號、當前工作資料夾……)並未改變。exec 僅僅是用還有乙個新程式替換了當前程序的正文、資料、堆和棧段(程序替換)。

exec 函式族的 6 個函式看起來似乎非常複雜,但實際上不管是作用還是使用方法都非常相似,僅僅有非常微小的區別。

l(list):引數位址列表,以空指標結尾。

v(vector):存有各引數位址的指標陣列的位址。

p(path):按 path 環境變數指定的資料夾搜尋可執行檔案。

e(environment):存有環境變數字串位址的指標陣列的位址。

exec 函式族裝入並執行可執行程式 path/file,並將引數 arg0( arg1, arg2, ar**, envp ) 傳遞給此程式。

exec 函式族與一般的函式不同,exec 函式族中的函式執行成功後不會返回,並且。exec 函式族以下的**執行不到。僅僅有呼叫失敗了,它們才會返回 -1,失敗後從原程式的呼叫點接著往下執行。

excel**:

#include #include int main(int argc, char *ar**)

執行結果:

execv()演示樣例**:

execv() 和 execl() 的使用方法基本是一樣的,無非將列表傳參,改為用指標陣列。

#include #include int main(int argc, char *ar**);	

// /bin/ls:外部程式。這裡是/bin資料夾的 ls 可執行程式,必須帶上路徑(相對或絕對)

execv("/bin/ls", arg);

perror("execv");

return 0;

}

execlp() 或 execvp() 演示樣例**:

execlp() 和 execl() 的差別在於,execlp() 指定的可執行程式能夠不帶路徑名,假設不帶路徑名的話,會在環境變數 path指定的資料夾裡尋找這個可執行程式,而 execl() 指定的可執行程式。必須帶上路徑名。

[cpp]view plain

copy

#include 

#include 

intmain(

intargc, 

char

*ar**)  

;execvp("ls", arg);

*/perror("execlp"

);  

return

0;  

}  

execle() 或 execve() 演示樣例**:

execle() 和 execve() 改變的是 exec 啟動的程式的環境變數(僅僅會改變程序的環境變數,不會影響系統的環境變數)。其它四個函式啟動的程式則使用預設系統環境變數。

execle()演示樣例**:

#include #include #include // getenv()

int main(int argc, char *ar**);

/* ./edu:外部程式,當前路徑的 edu 程式,通過 gcc edu.c -o edu 編譯

edu:這裡沒有意義

null:給 edu 程式傳參結束

env:改變 edu 程式的環境變數,正確來說,讓 edu 程式僅僅保留 env 的環境變數

*/execle("./edu", "edu", null, env);

/*char *arg=;

execve("./edu", arg, env);

*/ perror("execle");

return 0;

}

外部程式。edu.c 演示樣例**:

#include #include #include int main(int argc, char *ar**)

執行結果:

Linux系統程式設計 exec程序替換

1 讓父子程序執行不相干的操作 也就是說,在乙個執行的程式a中,呼叫另外的應用程式b。2 換核不換殼 exec族函式,能夠替換程序位址空間中的 段.text段 對應的堆 棧中的資料都會改變 重新填充新的 execl系列是變參函式 int execl const char path,const cha...

Linux系統程式設計 程序替換 exec 函式族

在 windows 平台下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為乙個程序 而在 linux 平台,我們可以通過.執行,讓乙個可執行程式成為乙個程序。但是,如果我們本來就執行著乙個程式 程序 我們如何在這個程序內部啟動乙個外部程式,由核心將這個外部程式讀入記憶體,使其執行起來成為乙個程...

Linux系統程式設計 程序替換 exec 函式族

在 windows 平台下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為乙個程序 而在 linux 平台,我們可以通過.執行,讓乙個可執行程式成為乙個程序。但是,如果我們本來就執行著乙個程式 程序 我們如何在這個程序內部啟動乙個外部程式,由核心將這個外部程式讀入記憶體,使其執行起來成為乙個程...