EXECVE(2)

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)

[中文版維護人]
徐明 <xuming@users.sourceforge.net>

[中文版最新更新]
2003/05/13

《中國Linux論壇man手冊頁翻譯計劃》
http://cmpp.linuxforum.net

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