C 程式設計/POSIX 參考/unistd.h/exec
exec 函式集合是類 Unix 作業系統 中的函式,它們會導致正在執行的程序被傳遞給函式作為引數的程式完全替換。由於沒有建立新的程序,程序識別符號 (PID) 不會改變,但原始程序的資料、堆和棧會被新程序的資料、堆和棧替換。
在 execl、execlp、execv 和 execvp 呼叫中,新程序映像繼承了當前的 環境變數。
在執行 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 | 沒有足夠的記憶體來執行新程序映像。 |
- ↑ http://www.gnu.org/software/bash/manual/bashref.html#IDX74 - exec 內建命令在 bash 手冊中
- ↑ http://tldp.org/LDP/abs/html/wrapper.html
- : 執行一個檔案 – 系統介面參考,單一 UNIX® 規範,第 7 版,來自開放組