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类

    1. e类

      execve,execle等,他们允许用户通过使用envp参数显式指定环境变量

    2. p类

      execlp,execvp等,他们只需要提供运行的程序名即可,系统会在环境变量PATH中来找

      如果pathname中包含'\',那么系统还是会将其视为路径名而不是文件名

    3. 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系统调用的更多相关文章

  1. exec系统调用 && 进程的加载过程

    exec系统调用会从指定的文件中读取并加载指令,并替代当前调用进程的指令.从某种程度上来说,这样相当于丢弃了调用进程的内存,并开始执行新加载的指令. exec系统调用会保留当前的文件描述符表单.所以任 ...

  2. 系统调用wait、waitpid和exec函数

    本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...

  3. [Linux]系统调用理解(3)

    本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...

  4. Linux中exec命令相关

    Linux中exec命令相关 exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. b ...

  5. Linux系统调用(转载)

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  6. shell中exec解析(转)

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  7. shell中exec解析

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  8. Linux exec与文件描述符

    看到好几篇文章讲述exec都是一知半解,所以我尽量说的清楚明白一些.本文首先讲述Linux文件描述符,然后是exec,最后举例说明exec I/O重定向及其用法. 概念:exec命令用于调用并执行指令 ...

  9. exec函数族的作用与讲解

    apue看到第八章,对exec函数族的理解一直都很混乱,总觉得不对劲儿,其实不能理解的先暂时跳过,看到后面,再结合实例也就慢慢的理解了. 以下内容转自:http://www.cppblog.com/p ...

  10. [100]shell中exec解析

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> 本地变量可以理解为局部变量,参考:shell基础 参考 bash shell的命令分为两类:外部命令 ...

随机推荐

  1. 一文带你搞懂从动态代理实现到Spring AOP

    摘要:本文主要讲了Spring Aop动态代理实现的两种方式. 1. Spring AOP Spring是一个轻型容器,Spring整个系列的最最核心的概念当属IoC.AOP.可见AOP是Spring ...

  2. 一文带你熟悉Pytorch->Caffe->om模型转换流程

    摘要:本文旨在分享Pytorch->Caffe->om模型转换流程. 标准网络 Baseline:PytorchToCaffe 主要功能代码在: PytorchToCaffe +-- Ca ...

  3. 云小课 | 玩转HiLens Studio之手机实时视频流调试代码

    摘要:在开发技能过程中,搭配视频流调试技能是非常必要的环节,也是检验技能效果的重要环节.HiLens Studio推出使用手机实时视频流调试代码的功能,以手机摄像头实时的视频流作为技能输入,查看技能输 ...

  4. 开心档之MySQL 创建数据库

    MySQL 创建数据库 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 以下命令简单的演示了创建数据库的过程,数据名为 ...

  5. 电商流量分析怎么做?试试这款数据工具 DataLeap!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作为成熟的电商模式,货架场景可以让商家以更低的门槛入驻,让消费者完成更高销量的购买和复购. 在这一场景下,运营人员 ...

  6. Mapper that could not be found

    现象1 mapper 资源扫不到 resources 建的是 目录 ,不是 package 所以如果直接 a.b 的方式创建,会扫描不到 mapper.xml 文件 现象2 缺少配置文件 HisDru ...

  7. 将镜像上传到Docker Hub中央仓库中

    首先创建一个镜像,点击:创建一个简单的Docker镜像 1.先注册帐号 https://hub.docker.com/ 2.将镜象推上去 [root@localhost docker]# docker ...

  8. Python分析大数据,推荐四款加速器

    在数据科学计算.机器学习.以及深度学习领域,Python 是最受欢迎的语言.Python 在数据科学领域,有非常丰富的包可以选择,numpy.scipy.pandas.scikit-learn.mat ...

  9. java字符串与json互转

    开发中经常遇到将字符串转成json和字符串转成json属组的方法,网上搜到的方法,好多都是不好用的,今天这里记录一下方便自己今后查看,也提供给需要的人. 依赖: <!-- 处理json --&g ...

  10. <vue 基础知识 3、v-bind使用>

    代码结构 一.     v-bind基本使用 1.效果 2.代码 01-v-bind基本使用.html <!DOCTYPE html> <html lang="en&quo ...