EXECVE(2) | Linux Programmer's Manual | EXECVE(2) |
execve - 执行程序
#include <unistd.h>
int execve (const char *filename, char *const argv [], char *const envp[]);
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.
调用成功 的 时候 execve() 不会 返回, 调用失败 时 返回 -1, 并 设置 errno 为 相应的 值.
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 错误情况 的 文档.
SUID and SGID processes can not be ptrace()d SUID or SGID.
在 #! 格式的 shell 可执行脚本 中, 第一行 的 长度 不得 超过 127 字节.
Linux 忽略 脚本程序 的 SUID 和 SGID 位.
ld.so(8), execl(3), fork(2)
徐明 <xuming@users.sourceforge.net>
2003/05/13
http://cmpp.linuxforum.net
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
3 September 1997 | Linux 2.0.30 |