Provided by: manpages-zh_1.5.2-1.1_all bug

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  核心 空間 不足.

       ENOTDIRfilename , 稿本解釋器 或 ELF 解釋器 的 前綴 路徑 中, 某些 成員 不是 目錄.

       EACCESfilename 或 稿本解釋器 的 前綴 路徑 中, 對 某些 目錄 沒有 訪問許可.

       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