[转帖]exec系统调用
https://www.jianshu.com/p/3bf14f7d889c
进程的执行(exec)
execve
ececve系统调用可以将新程序加载到调用进程的内存空间,在这一过程中,将丢弃现有的进程的文本段,同时,进程的堆栈段,数据都会被新进程的相应部件所替换
在执行完各种初始化代码之后(比如C++的构造函数),新的程序会从main处开始执行
通常的使用方法是使用fork创建子进程,然后使用execve()执行新进程
#include<unistd.h>
int execve(const char*pathname, char *const argv[], char *const envp[])
//永远都是返回失败
参数解析
pathname:准备载入当前进程空间的新程序的路径名,相对或者绝对都可以
argv:传递给新进程的命令行参数
envp:新程序的环境列表,一般直接赋为environ
进程id
execve()调用之后,进程的ID依旧保持不变
用户
execve()调用后,会以进程的有效用户ID(effective-id)去覆盖保存用户ID(saved-id)
exec的各种xd
#include<unistd.h> int execle(const char *pathname, const char *arg, ...,
(char *)NULL, char *const envp[]);
int execlp(const char *filename, const char *arg, ..., (char *) NULL);
int execvp(const char* pathname, char *const argv[]);
int execl(const char*pathname, const char *arg, ..., (char *)NULL);
//永远都是返回失败
上面的...代表的是可变参数列表,即一个或多个参数,可以使用stdarg系列API进行解读
这些系统调用可以分为3类
e类
execve,execle等,他们允许用户通过使用envp参数显式指定环境变量
p类
execlp,execvp等,他们只需要提供运行的程序名即可,系统会在环境变量PATH中来找
如果pathname中包含'\',那么系统还是会将其视为路径名而不是文件名
l类
execlp,execl等,可以使用可变参数列表来指定参数
fexecve
fexecve可以执行由文件描述符指定的程序,而不是通过路径名
#include<unistd.h>
int fexecve(int fd, char *const argv[], char *const envp[])
//永远返回失败
解释器脚本
上述系统调用其实不仅能够指定可执行文件,还能够指定脚本文件
拿shell举例:
在脚本文件的开头,往往会有着这么一行
#! /bin/bash [附加参数]
这一行用来指定脚本文件的解释器,shell脚本当然就是指定bash了
执行过程
当使用exec()(指一系列系统调用)来运行脚本文件时,如果execve()检测到传入的文件以"#!"开头,那么他就会按照如下的参数列表来执行解释器程序
解释器路径 [附加参数] 脚本文件路径 脚本文件参数
其中脚本文件路径和脚本文件参数都是在函数的参数列表中给出的,前面的解释器路径,附加参数都是从脚本文件的首行得到的
由上可以看出,附加参数是与解释器路径搭配使用的,比如指定/bin/bash为解释器,那么就可以使用-c,-i等参数
注:execlp和execvp有些特殊,如果脚本文件首行没有指定解释器,那么他们会通过环境变量找到指定脚本文件后,会默认使用shell来解释
文件描述符与exec
默认情况下,有exec的调用程序所打开的所有文件描述符在exec的执行过程中会保持打开状态,且在新程序中仍然有效,这一特性确保了新执行的进程无需再次打开文件,十分有用
执行时关闭标志(FD_CLOEXEC)
从安全编程的角度出发,应该在加载新程序之前确保关闭那些不必要的文件描述符,打开文件时指定FD_CLOEXEC标志就可以做到这一点
如果设置了该标志,那么在执行exec系统调用时,会自动的关闭该文件,如果调用exec失败,那么文件描述符仍会保持打开状态
信号与exec
信号处置
调用exec时会丢弃进程的文本段,那么自然就会丢弃程序的信号处理函数,如果在调用之前对某一个信号的设置为SIG_IGN或者SIG_DFL,那么在执行exec调用后,这些信号的处置将不会改变,否则,信号处置统统都会被置为SIG_DFL
掩码及等待队列
在执行exec之后,进程的信号掩码以及pending信号的设置均得以保存
[转帖]exec系统调用的更多相关文章
- exec系统调用 && 进程的加载过程
exec系统调用会从指定的文件中读取并加载指令,并替代当前调用进程的指令.从某种程度上来说,这样相当于丢弃了调用进程的内存,并开始执行新加载的指令. exec系统调用会保留当前的文件描述符表单.所以任 ...
- 系统调用wait、waitpid和exec函数
本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...
- [Linux]系统调用理解(3)
本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...
- Linux中exec命令相关
Linux中exec命令相关 exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. b ...
- Linux系统调用(转载)
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- shell中exec解析(转)
参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...
- shell中exec解析
参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...
- Linux exec与文件描述符
看到好几篇文章讲述exec都是一知半解,所以我尽量说的清楚明白一些.本文首先讲述Linux文件描述符,然后是exec,最后举例说明exec I/O重定向及其用法. 概念:exec命令用于调用并执行指令 ...
- exec函数族的作用与讲解
apue看到第八章,对exec函数族的理解一直都很混乱,总觉得不对劲儿,其实不能理解的先暂时跳过,看到后面,再结合实例也就慢慢的理解了. 以下内容转自:http://www.cppblog.com/p ...
- [100]shell中exec解析
参考:<linux命令.编辑器与shell编程> <unix环境高级编程> 本地变量可以理解为局部变量,参考:shell基础 参考 bash shell的命令分为两类:外部命令 ...
随机推荐
- 共赴元宇宙新纪元,华为云VR开发应用大赛总决赛倒计时7天!
摘要:"第三届华为云VR开发应用暨沈阳元宇宙开发应用大赛"总决赛即将于2月13日在沈阳市和平区揭幕. 由沈阳市和平区人民政府.华为技术有限公司共同主办的"第三届华为云VR ...
- 从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的
摘要:在本文中,您将学习Python中的三个令人印象深刻的函数,即map(),filter和reduce(). Python提供了许多预定义的内置函数,最终用户可以通过调用它们来使用它们.这些功能不仅 ...
- 40个问题让你快速掌握Java多线程的精髓
摘要:多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行. 多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这 ...
- RDS:一致性处理事务的神器
摘要:RDS关系型数据库是一种基于云计算平台的即开即用.稳定可靠.弹性伸缩.便捷管理的在线关系型数据库服务. 本文分享自华为云社区<一致性处理事务这下还是看RDS的吧[秋招特训]>,作者: ...
- 云小课 | 玩转HiLens Studio之快速订购HiLens Studio版本
摘要:华为HiLens是端云协同多模态AI开发应用平台,提供给开发者的多语言类集成开发环境HiLens Studio,开发者可以在HiLens Studio 中编写和调试技能代码. 本文分享自华为云社 ...
- 开心档之CSS 测验
目录 CSS 测验 编辑 CSS 测验 CSS测验是一种衡量前端开发人员对CSS的熟练程度的测试.通过CSS测验,可以评估一个人对CSS语言的掌握程度和应用能力,帮助公司或招聘方挑选合适的人才. ...
- Mapper that could not be found
现象1 mapper 资源扫不到 resources 建的是 目录 ,不是 package 所以如果直接 a.b 的方式创建,会扫描不到 mapper.xml 文件 现象2 缺少配置文件 HisDru ...
- RocketMQ事务消息在订单创建和库存扣减的使用
前言 下单的过程包括订单创建,还有库存的扣减,为提高系统的性能,将库存放在redis扣减,则会涉及到Mysql和redis之间的数据同步,其中,这个过程还涉及到,必须是订单创建成功才进行库存的扣减操作 ...
- 透析阿里云视频云「低代码音视频工厂」之能量引擎——vPaaS 视频原生应用开发平台
为满足企业用户极速搭建高品质专属音视频业务的需求,阿里云视频云的"低代码音视频工厂"应运而生,但极速而高品质的平台搭建诉求,需要用全新的开发方式才能真正实现,而全新的开发方式背后蕴 ...
- 【JAVA基础】Session使用
Session使用 用户注册 详见: https://blog.csdn.net/maxiangyu_/article/details/124088948 BaseController package ...