1. 程式人生 > >Linux系統程式設計---程序替換

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

程序替換

我們知道,在 Windows 平臺下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為一個程序;而在 Linux 平臺,我們可以通過 ./ 執行,讓一個可執行程式成為一個程序。

但是,如果我們本來就執行著一個程式(程序),我們如何在這個程序內部啟動一個外部程式,由核心將這個外部程式讀入記憶體,使其執行起來成為一個程序呢?這裡我們通過 exec 函式族實現。並且,我們通常fork一個子程序,目的就是讓它和父程序執行不同的程式,所以這時就要用到exec函式來實現程序替換。

exec 函式族,

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

#include <unistd.h>

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 函式族的 6 個函式看起來似乎很複雜,但實際上無論是作用還是用法都非常相似,只有很微小的差別。掌握了規律就很好記住。

l(list): 引數地址列表,以空指標結尾。
v(vector): 存有各引數地址的指標陣列的地址。
p(path): 按 PATH 環境變數指定的目錄搜尋可執行檔案。
e(environment): 存有環境變數字串地址的指標陣列的地址。

函式名 引數格式 是否帶路徑 是否使用當前環境變數
execl 列表 不是
execlp 列表
execle 列表 不是 不是,須自己組裝環境變數
execv 陣列 不是
execvp 陣列
execve 陣列 不是 不是 ,須自己組裝環境變數

exec 函式族提供了六種在程序中啟動另一個程式的方法。exec 函式族的作用是根據指定的檔名或目錄名找到可執行檔案,並用它來取代呼叫程序的內容,換句話說,就是在呼叫程序內部執行一個可執行檔案。

其中只有 execve() 是真正意義上的系統呼叫,其它5個都是在此基礎上經過包裝的庫函式。所以execv在man手冊第2節,其他在man函式手冊第3節。

他們呼叫方式如圖

在這裡插入圖片描述

注意:
程序呼叫一種 exec 函式時,該程序完全由新程式替換,而新程式則從其 main 函式開始執行。因為呼叫 exec 並不建立新程序,所以前後的程序 ID (當然還有父程序號、程序組號、當前工作目錄……)並未改變。exec 只是用另一個新程式替換了當前程序的正文、資料、堆和棧段(程序替換)

在這裡插入圖片描述