摘要:本文主要講述如何在程序中執行新**,以及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族函式。程式替換函式 程式替...