execve

摘要:
总览#includeintexecve;描述execve()执行filename指出的程序.filename必须是二进制可执行文件,或者以"#!格式的shell可执行脚本中,第一行的长度不得超过127字节.Linux忽略脚本程序的SUID和SGID位.

总览 (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 位.

免责声明:文章转载自《execve》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CentOS erlang安装、emqtt并发模式与 RPS 模式之争,性能压测领域的星球大战下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

网页分页数据的三种抓取方式

目前,只有两种方法可以捕获其他网站的数据:我一开始尝试用第三方工具捕获所需的数据。现在我将介绍以三种形式捕获分页数据的方法。此方法通过循环生成数据分页的URL地址,例如:}上面的代码可以返回相应页面的html内容字符串,其分页控件通过post模式将分页信息提交给后台代码。当您将鼠标移到每个页码上时,状态栏将显示javascript:...

windows server2012 nVME和网卡等驱动和不识别RAID10问题

安装2012--不识别M.2nVME,下载官方驱动程序,并将其注入没有多个驱动程序的系统--添加ITSK通用驱动程序:|Win8012R2.x64网卡驱动程序无法打开--提取官方驱动程序EXE文件以添加网卡驱动程序不识别SATARAID10--超过2T,最大Legacy为2T。...

SqlServer数据库存入decimal类型数据注意事项

对于sqlserver,Decimal可用于存储具有小数点和固定值的值。与浮点和实数不同,十进制用于存储近似值。目的是满足精确数学运算的需要。它是最大和最精确的浮点数字类型。对于十进制类型,请注意必须指定精度;否则,十进制只能存储为整数,就像int一样。例如,十进制是存储长度为18位和小数点后2位的数据。...

java中cookie存取值

Cookie保存值:CookieuserCookie=newCookie(“loginInfo”,loginInfo);userCookie.setMaxAge(30*24*60*60);//生存期为一个月30*24*60*60userCookie.setPath(“/”);response.addCookie(userCookie);Cookie值:Coo...

PowerQuery清理非文件名字符(清除指定列表中的所有字符)

在左侧导航窗格的空白区域右击,依次找到空白查询项接下来的思路是:遍历列表SearchList中的所有项,依次清理Data表中所有想要处理的列。第三个参数是一个函数:它告诉List.Accumulate函数,在每一次使用SearchList中某一项操作Data表时,其操作的方式是如何的。...

jquery跨域请求数据

Jquery跨域请求数据Jquery跨请求数据。事实上,这很容易。请遵循以下步骤:首先,编写js,通过get获取远程数据。请注意,回调参数应添加在链接之后,这意味着将回调函数地址传输到远程页面。',{params},函数cb{alert;alert;},'json');第二:编写处理程序。publicvoidProcessRequest{context.Re...