跳轉至內容

C 程式設計/POSIX 參考/unistd.h/exec

來自華夏公益教科書,自由的教學讀物

exec 函式集合是類 Unix 作業系統 中的函式,它們會導致正在執行的程序被傳遞給函式作為引數的程式完全替換。由於沒有建立新的程序,程序識別符號 (PID) 不會改變,但原始程序的資料、堆和棧會被新程序的資料、堆和棧替換。

execlexeclpexecvexecvp 呼叫中,新程序映像繼承了當前的 環境變數

在執行 exec 呼叫時開啟的檔案在新程序中保持開啟狀態。此方面用於指定新程序的 標準流 (stdin、stdout 和 stderr)。

MS-DOS 環境中,使用 exec 函式之一執行的程式總是被載入到記憶體中,就好像程式可執行檔案頭中的“最大分配”被設定為預設值 0xFFFF。EXEHDR 實用程式可用於更改程式的最大分配欄位。但是,如果執行此操作,並且使用 exec 函式之一呼叫程式,則該程式的行為可能與從作業系統命令列直接呼叫或使用 spawn 函式之一呼叫的程式的行為不同。

許多 Unix shell 還提供一個 exec 內建命令,用於用指定的程式替換 shell 程序。[1] 包裝器 指令碼通常使用此命令在設定環境變數或其他配置後執行程式(直接或透過 直譯器虛擬機器)。透過使用 exec,shell 程式使用的資源在啟動程式後無需繼續使用。[2]

這些函式在 unistd.h 標頭檔案中宣告用於 POSIX 標準,在 process.h 標頭檔案中宣告用於 DOS、OS/2 和 Windows。

int execl(const char *pathname, const char *arg0, ..., (char *) NULL);
int execle(const char *path, const char *arg0, ...,(char *) NULL, char const *envp[]);
int execlp(const char *file, const char *arg, ..., (char *) NULL);
int execv(const char *pathname, char const *argv[]);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execvp(const char *file, char *const argv[]);

一些實現提供這些函式,這些函式的名稱前面帶有下劃線(例如 _execl)。

函式名稱

[編輯 | 編輯原始碼]

每個函式的基是 exec,後面跟著一個或多個字母

e - 一個指向 環境變數 的指標陣列被顯式地傳遞給新程序映像。
l - 命令列引數 被單獨傳遞給函式。
p - 使用 PATH 環境變數 來查詢要執行的 path 引數中指定的檔案。
v - 命令列引數作為指標陣列傳遞給函式。

path 引數指定作為新程序映像執行的檔案的路徑名。從 arg0 開始的引數是指向要傳遞給新程序映像的引數的指標。argv 值是指向引數的指標陣列。

第一個引數 arg0 應該是可執行檔案的名稱。通常它與 path 引數的值相同。一些程式可能會錯誤地依賴此引數提供可執行檔案的位置,但對此沒有保證,而且它在不同平臺上也沒有標準化。

引數 envp 是指向環境設定的指標陣列。以 e 結尾的 exec 呼叫透過 envp 引數傳遞環境設定列表來更改新程序映像的環境。此引數是一個指向以 null 結尾的字串的指標陣列。envp 陣列必須以 NULL 指標結尾。

每個以 null 結尾的字串都具有以下格式

name=value

其中 name 是環境變數名稱,value 是該變數的值。envp 陣列的最後一個元素必須為 null。如果 envp 本身是 null,則新程序將繼承當前環境設定。

返回值

[編輯 | 編輯原始碼]

通常,exec 函式將替換當前程序,因此它不能向原始程序返回任何內容。程序確實具有 退出狀態,但該值由 父程序 收集。

如果 exec 函式確實返回到呼叫程序,則發生錯誤,返回值為 −1,並且 errno 被設定為以下值之一

名稱 註釋
E2BIG 引數列表超過系統限制。
EACCES 指定的檔案存在鎖定或共享衝突。
ENOENT 檔案或路徑名未找到。
ENOMEM 沒有足夠的記憶體來執行新程序映像。

參考資料

[編輯 | 編輯原始碼]
  1. http://www.gnu.org/software/bash/manual/bashref.html#IDX74 - exec 內建命令在 bash 手冊中
  2. http://tldp.org/LDP/abs/html/wrapper.html
[編輯 | 編輯原始碼]
  • exec: 執行一個檔案 – 系統介面參考,單一 UNIX® 規範,第 7 版,來自開放組
華夏公益教科書