NAME

execve - 執行程式
 

總覽 (SYNOPSIS)

#include <unistd.h>
 
int execve (const char *filename, char *const argv [], char *const envp[]);
 

描述 (DESCRIPTION)

execve() 執行 filename 指出的 程式. filename 必須 是 二進位制可執行檔案, 或者 以 " #! interpreter [arg]" 行 開始的 指令碼檔案. 後者的 interpreter 必須是 某個 可執行檔案 的 有效 路徑, 這個 可執行檔案 自身 不能是 指令碼程式, 呼叫 形式 是 " interpreter [arg] filename".
 
execve() 呼叫 成功 後 不會 返回, 其 程序 的 正文(text), 資料(data), bss 和 堆疊(stack) 段 被 調入程式 覆蓋. 調入程式 繼承了 呼叫程式 的 PID 和 所有 開啟的 檔案描述符, 他們 不會 因為 exec 過程 而 關閉. 父程序 的 未決 訊號 被 清除. 所有 被 呼叫程序 設定過 的 訊號 重置為 預設行為.
 
如果 當前程式 正在 被 ptrace 跟蹤, 成功的 呼叫 execve() 後 將 收到 一個 SIGTRAP 訊號.
 
如果 可執行檔案 是 動態連線 的 a.out 二進位制程式, 含有 共享庫 的 stub, 開始 執行 程式 的 時候, Linux 動態 聯結器(linker) ld.so(8) 把 所需的 共享庫 調入 核心, 並且 和 程式 相連.
 
如果 可執行檔案 是 動態連線 的 ELF 二進位制程式, 定義在 PT_INTERP 欄位 的 直譯器(interpreter) 調入 所需的 共享庫. 連線 libc5 的 程式 的 典型 直譯器 是 /lib/ld-linux.so.1, 而 連線 GNU libc2 (libc6) 的 程式 則為 /lib/ld-linux.so.2.
 

返回值 (RETURN VALUE)

呼叫成功 的 時候 execve() 不會 返回, 呼叫失敗 時 返回 -1, 並 設定 errno 為 相應的 值.
 

錯誤 (ERRORS)

EACCES
檔案 或 指令碼直譯器 不正確.
EACCES
沒有 檔案 或 指令碼直譯器 的 執行 許可權.
EACCES
檔案系統 掛載(mount) 為 noexec.
EPERM
檔案系統 掛載為 nosuid, 使用者 不是 超級使用者, 以及 檔案 設定了 SUID 或 SGID 位.
EPERM
程序 正 被跟蹤, 使用者 不是 超級使用者, 以及 檔案 設定了 SUID 或 SGID 位.
E2BIG
引數列表 過長.
ENOEXEC
可執行檔案 的 檔案格式 無法 識別, 誤用在 不同的 體系結構, 或者 其他 格式 錯誤 導致 程式 無法 執行.
EFAULT
filename 指標 超出 可訪問 的 地址空間.
ENAMETOOLONG
filename 太長.
ENOENT
filename , 指令碼直譯器, 或 ELF 直譯器 不存在.
ENOMEM
核心 空間 不足.
ENOTDIR
filename , 指令碼直譯器 或 ELF 直譯器 的 字首 路徑 中, 某些 成員 不是 目錄.
EACCES
filename 或 指令碼直譯器 的 字首 路徑 中, 對 某些 目錄 沒有 訪問許可.
ELOOP
解析 filename , 指令碼直譯器 或 ELF 直譯器 時 遇到 過多的 符號連線.
ETXTBUSY
可執行檔案 被 一個 或 多個 程序 以 寫方式 開啟.
EIO
發生 I/O 錯誤.
ENFILE
達到 系統 定義的 同時開啟檔案數 限制.
EMFILE
程序 打開了 最大數量 的 檔案.
EINVAL
該 ELF 可執行檔案 擁有 多個 PT_INTERP 欄位 (就是說, 試圖 定義 多個 直譯器).
EISDIR
ELF 直譯器 是 目錄.
ELIBBAD
無法 識別 ELF 直譯器 的 格式.

CONFORMING TO

SVr4, SVID, X/OPEN, BSD 4.3. POSIX 沒有 對 #! 行為 的 文件, 但有 其他的 相容 形式. SVr4 記錄了 額外的 錯誤情況 EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX 沒有 關於 ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR 或 ELIBBAD 錯誤情況 的 文件.
 

注意 (NOTES)

SUID and SGID processes can not be ptrace()d SUID or SGID.
 
在 #! 格式的 shell 可執行指令碼 中, 第一行 的 長度 不得 超過 127 位元組.
 
Linux 忽略 指令碼程式 的 SUID 和 SGID 位.
 

另見 (SEE ALSO)

ld.so(8), execl(3), fork(2)
 

[中文版維護人]

徐明 <[email protected]>

[中文版最新更新]

2003/05/13

《中國Linux論壇man手冊頁翻譯計劃》

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
 
中文 man 手冊頁計劃: https://github.com/man-pages-zh/manpages-zh

Recommended readings

Pages related to execve you should read also: