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. C++篇:第十二章_文件及IO_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十二.文件及IO 当在输入输出流中使用控制符进行格式控制时,需在程序中加入头文件 ...

  2. 手把手带你做LiteOS的树莓派移植

    摘要:树莓派是英国的慈善组织"Raspberry Pi 基金会"开发的一款基于arm的微型电脑主板.本文介绍基于LiteOS的树莓派移植过程. 本文分享自华为云社区<2021 ...

  3. 云图说|分布式事务管理DTM:“买买买”背后的小帮手

    摘要:分布式事务管理DTM通过提供高性能.高可靠.低侵入等核心价值,可以更好的帮助企业应对微服务场景带来的一致性问题. 本文分享自华为云社区<[云图说]第224期 分布式事务管理DTM,&quo ...

  4. 火山引擎DataLeap如何解决SLA治理难题(三): 平台架构与未来展望

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 平台架构总结 火山引擎 DataLeap SLA平台整体主要分为基础组件.规划式治理服务.响应式治理服务三大块,系 ...

  5. 火山引擎 VeDI 零售行业解决方案 聚焦精准营销场景提升品牌转化

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 你知道,为了能让你买到合适的商品,品牌商们有多努力吗? 精准营销并不是一个新词,但近年来,随着营销渠道/平台的更加 ...

  6. Markdown 图片居中显示,增加图片说明

    <center> <img src="https://img2023.cnblogs.com/blog/80824/202308/80824-202308081307138 ...

  7. 【短道速滑四】Halcon的texture_laws算子自我研究

    Halcon里有个texture_laws 算子,最近实现了下,记录下相关细节. Halcon的文档里对该算子是这样描述的: texture_laws - Filter an image using ...

  8. 收到邮件了,微软新必应(New Bing)可以用了,只隔了一天

    收到邮件了,微软新必应(New Bing)可以用了,只隔了一天 国内申请微软新必应(New Bing) 1号我写了一篇文章,介绍内置ChatGPT的微软新必应(New Bing)申请方法,没想到昨天就 ...

  9. 【GO】Go语言介绍 Go开发环境搭建 第一个helloworld 变量命名规范 变量的定义和使用

    今日内容 1 Go语言介绍 #Go语言介绍 Go 即 Golang,是Google公司2009年11月正式对外公开的一门编程语言 Go是[静态 强类型]语言,是区别于解析型语言的编译型语言 静态:类型 ...

  10. debian更新openssh 9.6

    先更新一下,然后安装libssl-dev zlib1g-dev依赖文件 apt update apt install build-essential apt-get install -y libssl ...