Manpages

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 [AT] users.net>

[中 文 版 最 新 更 新 ]

2003/05/13

《 中 国 Linux论 坛 man手 册 页 翻 译 计 划 》

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh