程序控制之exec函式

2021-04-25 02:55:59 字數 1358 閱讀 1033

1. exec函式

#include

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

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

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

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

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

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

這些函式之間的第乙個區別是前4個取路徑名做引數,後兩個則取檔名做引數。

當指定filename做引數時:

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

2). 否則就按path環境變數搜尋可執行檔案。

path=/bin:/usr/bin:/user/local/bin:.

最後的路徑字首表示當前目錄。零字首耶表示當前目錄(在name=value開始處可用:表示,在中間用::表示,在行尾用:表示)

第二個區別與參數列的傳遞有關(l表示list,v表示向量vector)。函式execl、execlp和execle要求將新程式的每個命令列引數都說明為乙個單獨的引數,這中參數列以空指標結尾。而execv、execve和execvp則要先構造乙個指向各引數的指標陣列,然後將該陣列的位址作為這三個函式的位址。

第三個區別與向新程式傳遞環境表相關。函式execve和execle可以傳遞乙個指向環境字串指標陣列的指標。

這6個函式較難記。字母p表示該函式去filename作為引數,並且用path環境變數尋找可執行檔案愛你。字母l表示該函式取乙個參數列,它與字母v互斥。字母v表示該函式取乙個argv向量。字母e表示該函式去envp陣列,而不使用當前環境。

這6個函式中,只有execve是核心的系統呼叫。

1.1. 呼叫程序與exec建立的程序的關係

當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,而新程式則從main函式開始執行。因為呼叫exec並不建立新程序,所以前後的程序id不變。函式exec只是用乙個全新的程式替換當前程序的正文、資料、堆和棧段。

1.2 例項

在下列程式中,先呼叫execle,它要求乙個路徑名和乙個特定的環境。下乙個呼叫的是execlp,它要求乙個檔名,並將呼叫者的環境傳給新程式。

程序控制之競爭條件 函式exec

當多個程序都企圖對共享資料進行某種處理,而最後的結果又取決於程序執行的順序時,這種情況被稱之為競爭條件 race condition 如果第乙個程序希望等待乙個子程序終止,則它必須呼叫wait函式中的乙個。如果乙個程序要等待其父程序終止,則可以使用下列形式的迴圈 while getppid 1 sl...

Linux程序控制 exec函式族

1 簡介 在linux中,並不存在exec 函式,exec指的是一組函式,一共有6個,分別是 include extern char environ int execl const char path,const char arg,int execlp const char file,const c...

Linux程序控制 exec函式族

1 簡介 在linux中,並不存在exec 函式,exec指的是一組函式,一共有6個,分別是 include extern char environ int execl const char path,const char arg,int execlp const char file,const c...