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 位.
execve - 执行程序的更多相关文章
- linux和docker的capabilities介绍
验证环境:centos7 x86/64 内核版本4.19.9 在linux 2.2版本之前,当内核对进程进行权限验证的时候,可以将进程划分为两类:privileged(UID=0)和unprivile ...
- Linux和Docker的Capabilities介绍及Setcap命令
Linux和Docker的capabilities介绍 转载:https://www.cnblogs.com/charlieroro/p/10108577.html 验证环境:centos7 x86/ ...
- 【Linux】【Basis】【Kernel】Linux常见系统调用
一,进程控制 1)getpid,getppid--获取进程识别号 #include <sys/types.h> #include <unistd.h> pid_t getpid ...
- Linux Process/Thread Creation、Linux Process Principle、sys_fork、sys_execve、glibc fork/execve api sourcecode
相关学习资料 linux内核设计与实现+原书第3版.pdf(.3章) 深入linux内核架构(中文版).pdf 深入理解linux内核中文第三版.pdf <独辟蹊径品内核Linux内核源代码导读 ...
- Linux 进程创建二(execve和wait)
三:execve系统调用 int execve(const char *filename, char *const argv[],char *const envp[]); fork创建了一个新的进程, ...
- linux内核情景分析之execve()
用来描述用户态的cpu寄存器在内核栈中保存情况.可以获取用户空间的信息 struct pt_regs { long ebx; //可执行文件路径的指针(regs.ebx中 long ecx; //命令 ...
- 执行新程序 execve()
新程序的执行 一:execve() 之所以叫新程序的执行,原因是这部分内容一般发生在fork()和vfork()之后,在子进程中通过系统调用execve()可以将新程序加载到子进程的内存空间.这个操作 ...
- execve(file, argv, env)参数argv获取字符串个数
/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU ...
- Android执行程序或脚本的方法
Java中提供了两种方法来执行程序或脚本: (1) 使用Runtime的exec()方法 (2) 使用ProcessBuilder的start()方法 ProcessBuilder.start() 和 ...
随机推荐
- 【208】CentOS 下安装 Wine
参考:centos6.5安装wine 参考:用FreeGate自-由-门软件在Linux上更新Android SDK 参考:CentOS 5.3 使用wine装QQ
- ibatis 中 $与#的区别
ibatis 中 $与#的区别 使用#: select * from table where id = #id# 如果字段为整型:#id#表示成id select * from table where ...
- node+pjax实现不刷新跳转
做前端的都知道如果通过a标签去访问跳转到某一个页面,浏览器会自动刷新.那么如何实现不刷新跳转? html5的出现让我们可以实现不刷新跳转页面.主要使用的方法:history.pushState(dat ...
- bzoj 2331: [SCOI2011]地板【插头dp】
一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...
- bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)
1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1122 Solved: 80 ...
- JVM的参数详解
今天就整理下JVM的参数!相对而已JVM有很多参数,但对于一般开发人员执行知道和堆栈大小,GC.远程调试的参数即可. JVM Parameters 首先需要说明的是JVM的参数形式: -X 开头的参数 ...
- 2.while循环 编码的初识,逻辑运算符 格式化输出
while循环 循环 while True: # while 是关键字 条件 print('精忠报国') print('团结就是力量') print('北京欢迎你') print('葫芦爷爷救娃娃') ...
- 9-26模拟赛 By cellur925
1.计数 (count.cpp/c/pas)时间限制:1s内存限制:256MB[问题描述]给出 m 个数 a[1],a[2],…,a[m]求 1~n 中有多少数不是 a[1],a[2],…,a[m]的 ...
- 如何使用go打出hell word
今天给大家带来一篇如何使用go打出hell word(手动滑稽) 关于go介绍的话,我就不多说了,在百度上一搜一大堆, 要使用的软件Visual Studio Code(VScode) 下载go的地址 ...
- 如何让Android微博个人详情页滚动到顶部
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/103 个人详情页滑动到顶部 最近产品提了个新需求,需要实现 ...