Provided by: manpages-zh_1.5.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

Linuxanhttp://cmpp.linuxforum.net