EXECVE
Section: Linux Programmer's Manual (2)
Updated: 3 September 1997
Index
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
Index
- NAME
-
- 总览 (SYNOPSIS)
-
- 描述 (DESCRIPTION)
-
- 返回值 (RETURN VALUE)
-
- 错误 (ERRORS)
-
- CONFORMING TO
-
- 注意 (NOTES)
-
- 另见 (SEE ALSO)
-
- [中文版维护人]
-
- [中文版最新更新]
-
- 《中国Linux论坛man手册页翻译计划》
-
This document was created by
man2html,
using the manual pages.
Time: GMT, January 14, 2004