Linux 程序中的替換函式(exec)

2021-08-27 23:41:34 字數 3260 閱讀 6680

摘要:本文主要講述如何在程序中執行新**,以及exec系列函式的基本使用方法.

在程序中執行新**

用函式fork建立子程序後,如果希望在當前子程序中執行新的程式,可以呼叫exec函式執行另乙個程式.當程序呼叫exec函式時,該程序使用者空間資源(正文、資料、堆和棧)完全由新程式替代,新程式則從main函式開始執行.因為呼叫exec函式並沒有建立新的程序,所以前後的程序id並沒有改變,也即核心資訊基本不做修改.

exec系列函式共有7函式可供使用,這些函式的區別在於:指示新程式的位置是使用路徑還是檔名,如果是使用檔名,則在系統的path環境變數所描述的路徑中搜尋該程式;在使用引數時使用引數列表的方式還是使用argv陣列的方式.

函式定義:

#include

int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );

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

int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp */ );

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

int execlp(const char *filename, const char *arg0, ... /* (char *)0 */ );

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

int fexecve(int fd, char *const argv, char *const envp);

返回值:如果執行成功將不返回,否則返回-1,失敗**儲存在errno中.

前4個函式取路徑名作為引數,後兩個是取檔名作為引數,最後乙個是以乙個檔案描述符作為引數.

l(list):表示引數採用列表

v(vector):引數採用陣列

p(path):有p自動搜尋環境變數path

e(env):表示自己維護環境變數

當指定filename作為引數時:

1)如果filename中包含/,則將其視為路徑名.

2)否則就按path環境變數,在它所指的各目錄搜尋可執行檔案.

int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );

execl()函式用來執行引數path字串所指向的程式,第二個及以後的引數代表執行檔案時傳遞的引數列表,最後乙個引數必須是空指標以標誌引數列表為空.

例子1:演示exec()函式的基本使用.

int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp */ );execle()函式用來執行引數path字串所指向的程式,第二個及以後的引數代表執行檔案時傳遞的引數列表,最後乙個引數必須指向乙個新的環境變數陣列,即新執行程式的環境變數.

例子2:

int execlp(const char *filename, const char *arg0, ... /* (char *)0 */ );execlp()函式會從path環境變數所指的目錄中查詢檔案名為第乙個引數指示的字串,找到後執行該檔案,第二個及以後的引數代表執行檔案時傳遞的引數列表,最後乙個引數必須是空指標.

例子3:

int execv(const char *path, char *const argv);execv()函式函式用來執行引數path字串所指向的程式,第二個為陣列指標維護的程式引數列表,該陣列的最後乙個成員必須是空指標.

例子4:

int execvp(const char *file, char *const argv);execvp()函式會從path環境變數所指的目錄中查詢檔案名為第乙個引數指示的字串,找到後執行該檔案,第二個及以後的引數代表執行檔案時傳遞的引數列表,最後乙個成員必須是空指標.

例子5:

他們的關係如下圖所示:

Linux中的替換程序execl函式

1.0x80號中斷所引發的中斷會使程式的執行陷入核心,程式執行核心 2.檔案表的概念 檔案表存在於程序描述符pcd中。系統呼叫open每開啟乙個檔案都會在檔案表中新增一項。open的返回值是該檔案在檔案表中的下標。在檔案表中0號下標對應的stdin 鍵盤輸入 的檔案,所以也可以直接使用0來代替std...

Linux 程序替換

當程序呼叫exec函式執行磁碟裡另乙個程式時,並不建立新程序,呼叫前後程序id並未改變,新程序的資料和 會替換掉物理記憶體中的資料段和 段,從而虛擬根據頁表找到的資料和 都會別替換成新的,所以當程序開始執行時,就要從要執行的程式開始執行。系統呼叫 int execve const char path...

Linux程序的程式替換

程式替換 假如作業系統正在執行某乙個程式,我們可以利用程式替換函式指定乙個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork乙個程序,如果fork成功,子程序會和父程序執行相同的 而我們建立子程序是希望子程序執行指定的操作,所以需要執行exec族函式。程式替換函式 程式替...