execl, execlp, execle, execv, execvp -
執行某個檔案
#include <unistd.h>
extern char **environ;
int execl( const char *path, const char *arg,
...);
int execlp( const char *file, const char *arg,
...);
int execle( const char *path, const char *arg ,
..., char * const envp[]);
int execv( const char *path, char *const
argv[]);
int execvp( const char *file, char *const
argv[]);
exec 系列 函式 用 新的
程序 映象 置換 當前的
程序 映象. 本 手冊頁
描述的 這些 函式
實際上 是 對
execve(2) 函式
的 前端(front-end) 包裝. (關於
當前程序 的 置換 詳見
execve 的 手冊頁.)
這些 函式 的 第一個
引數 是 待執行 程式 的
路徑名(檔名).
在 函式
execl,
execlp, 和
execle
中,
const char *arg 以及 省略號
代表 的 引數 可被 視為
arg0,
arg1, ...,
argn. 他們
合起來 描述了 指向 null
結尾的 字串 的 指標
列表, 即 執行程式 的
引數列表. 作為 約定,
第一個 arg 引數 應該
指向 執行程式名 自身.
引數列表
必須 用
NULL
指標 結束!
execv 和
execvp 函式 提供
指向 null 結尾的 字串 的
指標陣列 作為 新程式
的 引數列表. 作為 約定,
指標陣列 中 第一個
元素 應該 指向
執行程式名 自身.
指標陣列
必須 用
NULL
指標 結束!
execle 函式 同時 說明了
執行程序 的 環境(environment),
他 在
NULL 指標 後面
要求 一個 附加引數, NULL
指標 用於 結束
引數列表, 或者說, argv
陣列. 這個 附加引數 是
指向 null 結尾的 字串 的
指標陣列, 他
必須 用
NULL 指標 結束! 其他
函式 從 當前程序 的
environ 外部變數 中 獲取
新程序 的 環境.
某些 函式 有 特殊的
語義.
如果 提供的 檔名 中
不包含 斜槓符(/), 函式
execlp 和
execvp 將 同 shell 一樣
搜尋 執行檔案.
搜尋路徑 由 環境變數
PATH 指定. 如果 該 變數
不存在, 則 使用
預設路徑 ``:/bin:/usr/bin''. 另外,
某些 錯誤 要 特殊處理.
如果 對 某個 檔案 的
訪問 遭到 拒絕 (
execve
返回
EACCES), 這些 函式 將
在 搜尋路徑 中 繼續
尋找. 如果 沒有 找到
符合的 檔案, 他們
返回時 把
errno 置為
EACCES.
如果 無法 識別
檔案首部 (
execve 返回
ENOEXEC), 這些 函式 將 以
檔名 作為 第一個 引數
呼叫 shell. (如果 這個 嘗試
失敗 就 不再 進行 搜尋
了.)
任何
exec 函式 返回 均
表明 發生了 錯誤.
返回值 是 -1, 全域性變數
errno 指出 錯誤型別.
/bin/sh
這些 函式 均可能 失敗,
errno 被 置為 庫函式
execve(2) 設定的 各種
錯誤型別.
sh(1),
execve(2),
fork(2),
environ(5),
ptrace(2)
在 某些 其他系統 中,
預設路徑 (當 環境變數
PATH 不存在) 把
當前目錄 列在
/bin 和
/usr/bin 後面, 這是 為了
防止 特洛伊木馬. Linux
在這兒 採取了 傳統的
"當前目錄優先"
預設路徑.
當 試圖 執行 程式 並且
發生 錯誤 的 時候,
execlp
和
execvp 的 行為 是 歷史
習慣, 但是 沒有 進入
正式文件, 也沒有 被 POSIX
標準 說明. BSD (可能 還有
其他 系統) 中 程序 自動
進入 睡眠, 如果 發生 ETXTBSY,
他們 就 重試. 而 Linux
視此為 嚴重錯誤, 並且
立即 返回.
傳統的 做法中, 函式
execlp 和
execvp 忽略 所有
錯誤, 除了 上述的 錯誤,
ENOMEM 和
E2BIG. 如果 發生
這三類 錯誤, 他們 就
返回. 而 現在的 做法是,
不僅僅 上述的 錯誤,
任何 錯誤 均導致 函式
返回.
execl,
execv,
execle,
execlp 和
execvp
遵循 IEEE Std1003.1-88 (``POSIX.1'').
徐明 <[email protected]>
2003/05/13
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh