.\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" .\" Modified by Michael Haardt .\" Modified Wed Jul 21 22:47:01 1993 by Rik Faith .\" Modified 21 Aug 1994 by Michael Chastain : .\" Fixed typoes. .\" Modified Fri Jan 31 16:24:28 1997 by Eric S. Raymond .\" .TH EXECVE 2 "3 September 1997" "Linux 2.0.30" "Linux Programmer's Manual" .SH NAME execve \- 執行程式 .SH "總覽 (SYNOPSIS)" .B #include .sp .BI "int execve (const char *" filename ", char *const " argv .BI "[], char *const " envp []); .SH "描述 (DESCRIPTION)" \fBexecve()\fP 執行 \fIfilename\fP 指出的 程式. \fIfilename\fP 必須 是 二進制可執行檔案, 或者 以 "\fB#! \fIinterpreter \fR[arg]" 行 開始的 稿本檔案. 後者的 interpreter 必須是 某個 可執行檔案 的 有效 路徑, 這個 可執行檔案 自身 不能是 稿本程式, 調用 形式 是 "\fBinterpreter\fR [arg] \fIfilename\fR". \fBexecve()\fP 調用 成功 後 不會 返回, 其 進程 的 正文(text), 數據(data), bss 和 堆棧(stack) 段 被 調入程式 覆蓋. 調入程式 繼承了 調用程式 的 PID 和 所有 打開的 檔案描述符, 他們 不會 因為 exec 過程 而 關閉. 父進程 的 未決 信號 被 清除. 所有 被 調用進程 設置過 的 信號 重置為 預設行為. 如果 當前程式 正在 被 ptrace 跟蹤, 成功的 調用 \fBexecve()\fP 後 將 收到 一個 \fBSIGTRAP\fP 信號. 如果 可執行檔案 是 動態連接 的 a.out 二進制程式, 含有 共享庫 的 stub, 開始 執行 程式 的 時候, Linux 動態 連接器(linker) .IR ld.so (8) 把 所需的 共享庫 調入 核心, 並且 和 程式 相連. 如果 可執行檔案 是 動態連接 的 ELF 二進制程式, 定義在 PT_INTERP 字段 的 解釋器(interpreter) 調入 所需的 共享庫. 連接 libc5 的 程式 的 典型 解釋器 是 \fI/lib/ld-linux.so.1\fR, 而 連接 GNU libc2 (libc6) 的 程式 則為 \fI/lib/ld-linux.so.2\fR. .SH "返回值 (RETURN VALUE)" 調用成功 的 時候 \fBexecve()\fP 不會 返回, 調用失敗 時 返回 \-1, 並 設置 .I errno 為 相應的 值. .SH "錯誤 (ERRORS)" .TP 0.8i .B EACCES 檔案 或 稿本解釋器 不正確. .TP .B EACCES 沒有 檔案 或 稿本解釋器 的 執行 權限. .TP .B EACCES 檔案系統 掛載(mount) 為 .IR noexec . .TP .B EPERM 檔案系統 掛載為 .IR nosuid , 使用者 不是 超級使用者, 以及 檔案 設置了 SUID 或 SGID 位. .TP .B EPERM 進程 正 被跟蹤, 使用者 不是 超級使用者, 以及 檔案 設置了 SUID 或 SGID 位. .TP .B E2BIG 參數列表 過長. .TP .B ENOEXEC 可執行檔案 的 檔案格式 無法 識別, 誤用在 不同的 體系結構, 或者 其他 格式 錯誤 導致 程式 無法 執行. .TP .B EFAULT .I filename 指針 超出 可訪問 的 地址空間. .TP .B ENAMETOOLONG .I filename 太長. .TP .B ENOENT .I filename , 稿本解釋器, 或 ELF 解釋器 不存在. .TP .B ENOMEM 核心 空間 不足. .TP .B ENOTDIR 在 .I filename , 稿本解釋器 或 ELF 解釋器 的 前綴 路徑 中, 某些 成員 不是 目錄. .TP .B EACCES 在 .I filename 或 稿本解釋器 的 前綴 路徑 中, 對 某些 目錄 沒有 訪問許可. .TP .B ELOOP 解析 .I filename , 稿本解釋器 或 ELF 解釋器 時 遇到 過多的 符號連接. .TP .B ETXTBUSY 可執行檔案 被 一個 或 多個 進程 以 寫方式 打開. .TP .B EIO 發生 I/O 錯誤. .TP .B ENFILE 達到 系統 定義的 同時打開檔案數 限制. .TP .B EMFILE 進程 打開了 最大數量 的 檔案. .TP .B EINVAL 該 ELF 可執行檔案 擁有 多個 PT_INTERP 字段 (就是說, 試圖 定義 多個 解釋器). .TP .B EISDIR ELF 解釋器 是 目錄. .TP .B ELIBBAD 無法 識別 ELF 解釋器 的 格式. .SH "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 錯誤情況 的 文件. .SH "注意 (NOTES)" SUID and SGID processes can not be \fBptrace()\fPd SUID or SGID. 在 #! 格式的 shell 可執行稿本 中, 第一行 的 長度 不得 超過 127 字節. Linux 忽略 稿本程式 的 SUID 和 SGID 位. .SH "另見 (SEE ALSO)" .BR ld.so "(8)," .BR execl "(3)," .BR fork (2) .SH "[中文版維護人]" .B 徐明 .SH "[中文版最新更新]" .BR 2003/05/13 .SH "《中國Linux論壇man手冊頁翻譯計劃》" .BI http://cmpp.linuxforum.net