Linux - 进程控制(进程替换)

news2024/11/20 20:22:16

0.引入

创建子进程的目的是什么?

就是为了让子进程帮我执行特定的任务

让子进程执行父进程的一部分代码
如果子进程想执行一个全新的程序代码呢? 那么就要使用 进程的程序替换

为什么要有程序替换?

也就是说子进程想执行一个全新的程序代码!

这份代码看似是子进程的代码,其实也是父进程的代码,只是父进程通过id的值进行判断,让子进程运行。

1.替换原理

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

2.替换函数

其实有六种以exec开头的函数,统称exec函数:

使用man手册查看相关exec函数

execl最后的...参数,表示可变参数列表,可以给C函数传递任意的参数

execl


int execl(const char *path, const char *arg, ...);
  • path:新程序的路径和名称。

  • arg0 ~ argn:新程序的命令行参数列表,以 NULL 结尾。arg0 表示新程序的名称,arg1 ~ argn 表示新程序的各个参数。

为什么只看到了begin()... end...为什么不显示呢?

执行程序替换,新的代码和数据都被加载了,后续的代码属于老代码,直接被替换了,没机会执行了

并且程序替换是整体替换,不能局部替换!!!

ls是磁盘上的可执行程序,execl调用了ls-la

把当前的代码和数据,从execl到磁盘中进行替换

问题:进程的程序替换,有没有创建新的进程呢?

没有!!

为什么呢?很简单,因为我只是把一个新的程序加载到我们当前进程所对应的代码和数据段,我就让CPU去调度当前进程,就可以跑起来了。其中,我们并没有创建新的进程。当前的进程PID没有变化

这是站在进程的角度来看的

那么站在程序的角度呢? -- 这个程序被加载到内存里了

所以,我们也可以说execl是加载器

问题:当创建进程的时候,先加载进程数据结构,还是先加载代码和数据?

在创建进程时,操作系统通常会先创建进程数据结构,然后再加载代码和数据。

这里代码,子进程里的execl替换代码,会影响父进程吗?

不会,程序替换只会影响调用进程,进程具有独立性

子进程加载新程序的时候,是需要进行程序替换的,发生写时拷贝(子进程执行的可是全新的程序,新的代码,写时拷贝在代码区也可以发生)

execl函数调用失败,会发生什么?

我们写一个代码,让程序故意发生错误

父进程获取子进程退出码

接下来开始熟悉所有的接口

execv


 int execv(const char *path, char *const argv[]);

execv() 函数接受两个参数。第一个参数是要执行的程序的路径,第二个参数是传递给新程序的命令行参数。这些参数以一个字符串数组的形式传递给函数。

注意:当execv调用失败的话,程序继续执行

execlp


int execlp(const char *file, const char *arg, ...);

其中,file 参数表示要执行的可执行文件的名称,arg 参数表示传递给该可执行文件的命令行参数,最后的参数为可变参数列表,表示该命令行参数以 NULL 结束。

execlp 函数会在 PATH 环境变量指定的路径中查找可执行文件,因此无需指定可执行文件的完整路径。如果 PATH 环境变量中有多个路径,则 execlp 函数会按照路径的顺序查找可执行文件。


execlp("ls","ls","-a","-l","-n",NULL);

这里的两个ls分别是什么意思?

第一个是系统环境变量路径ls,第二个是ls指令

等同于以下代码

execle


 int execle(const char *path, const char *arg,
                  ..., char * const envp[]);

该函数接收以下参数:

  • path:要执行的程序的路径名。

  • arg0:新程序的第一个参数,通常是新程序的名称。

  • arg1~argn:新程序的参数列表。

  • envp:新程序的环境变量数组。

该函数的返回值是一个整数,如果成功执行,则永远不会返回。如果出现错误,则会返回-1,并设置errno来指示错误的类型。

envp[]数组是自定义环境变量

execvp

函数原型如下:


int execvp(const char *file, char *const argv[]);

该函数会在PATH环境变量指定的路径中搜索指定的可执行文件,并在找到文件后将当前进程替换为该可执行文件。

其中,file参数是一个字符串,指定要执行的可执行文件的路径和文件名。argv参数是一个指向字符串数组的指针,其中第一个字符串表示可执行文件的名称,后面的字符串表示传递给可执行文件的命令行参数。

execvpe

函数原型如下:


int execvpe(const char *file, char *const argv[], char *const envp[]);

file 参数是要执行的可执行文件的路径,argv 参数是一个指向参数列表的指针数组,envp 参数是一个指向环境变量列表的指针数组。

execvpe 函数首先会搜索 PATH 环境变量中指定的目录,找到可执行文件后,它会用新的进程替换当前进程,并开始执行新的程序。在新的进程中,参数和环境变量都被设置成 argvenvp 中指定的值。

execvpe 函数和其他 exec 系列函数的主要区别在于它会搜索 PATH 环境变量中指定的目录来查找可执行文件,并且可以设置环境变量。

execve

函数原型如下:


int execve(const char *filename, char *const argv[], char *const envp[]);

filename 参数是要执行的可执行文件的路径,argv 参数是一个指向参数列表的指针数组,envp 参数是一个指向环境变量列表的指针数组。

execve 函数会用新的进程替换当前进程,并开始执行新的程序。在新的进程中,参数和环境变量都被设置成 argvenvp 中指定的值。

execve 函数不会搜索 PATH 环境变量中指定的目录来查找可执行文件,它只会使用 filename 参数中指定的路径来查找可执行文件。如果指定的文件路径不是一个可执行文件,那么该函数会返回一个错误。

事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册第2节,其它函数在man手册第3节。这些函数之间的关系如下图所示。下图exec函数族 一个完整的例子:

3.调用自定义程序

上面都是执行命令。能否执行我自己写的程序呢?

用C语言调用C++写的可执行程序

可以发现PID是一模一样的,替换了C++程序,没有创建新的进程

接下来尝试在C++程序中获取环境变量

获取环境变量。C++的cout如果环境变量不存在,就什么都不会打印,所以要进行判断,如果没有就打印NULL

修改下C程序,在C程序中自定义环境变量表,使用execle函数

问题:C语言调用C++可以调用到环境变量吗?

修改下C++代码,获取环境变量

C++自己写的里有PATH,但没有环境变量

观察下C语言的

C语言调用的有MYENV 但是没有PATH

调用的环境变量是覆盖式写入,会覆盖老的环境变量PATH,所以看不到PATH

传系统环境变量

C语言提供的环境变量表,二级指针,environ

此时MYENV就没有了,系统的环境变量出现了

系统环境变量和自定义环境变量同时传递

利用putenv添加到系统环境变量里,依赖头文件#include<stdlib.h>

putenv将MYENV传到系统变量里,这样调用系统变量,就可以将自定义和系统变量一块传递给替换程序

环境变量具有全局属性,可以被子进程继承下去!
就是 通过execle函数传递的环境变量!
使用export MYENV = You can see me   也可以

4.exec函数解释

1.这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
2.如果调用出错则返回-1
3.所以exec函数只有出错的返回值而没有成功的返回值。

5.命名理解

这些函数原型看起来很容易混,但只要掌握了规律就很好记。

l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量

exec调用举例如下:


#include <unistd.h>
int main()
{
    char *const argv[] = {"ps", "-ef", NULL};
    char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};
    execl("/bin/ps", "ps", "-ef", NULL);
    // 带p的,可以使用环境变量PATH,无需写全路径
    execlp("ps", "ps", "-ef", NULL);
    // 带e的,需要自己组装环境变量
    execle("ps", "ps", "-ef", NULL, envp);
    execv("/bin/ps", argv);

    // 带p的,可以使用环境变量PATH,无需写全路径
    execvp("ps", argv);
    // 带e的,需要自己组装环境变量
    execve("/bin/ps", argv, envp);
    exit(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P3957 [NOIP2017 普及组] 跳房子 (动态规划)(内附封面)

[NOIP2017 普及组] 跳房子 题目背景 NOIP2017 普及组 T4 题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画…

3.病人排队

【题目】 病人登记看病&#xff0c;编写一个程序&#xff0c;将登记的病人按照以下原则排出看病的先后顺序&#xff1a; 老年人&#xff08;年龄 > 60岁&#xff09;比非老年人优先看病。 老年人按年龄从大到小的顺序看病&#xff0c;年龄相同的按登记的先后顺序排序。 非…

Flutter Flar动画实战

在Flare动面出现之前,Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画,如果遇到一些复杂的场景,使用这些动画方案实现起来还是有难度的。不过,随着Flutter开始支持Flare矢量动面,Flutter的动画开发也变得越来越简单。事实上,Flare动画…

leetcode 435. 无重叠区间

2023.8.3 本题和引爆气球 这题非常类似&#xff0c;利用同样的思路可以解决&#xff0c;代码如下&#xff1a; class Solution { public:static bool cmp(vector<int>& a , vector<int>& b){if(a[0] b[0]) return a[1] < b[1];return a[0] < b[0];…

cuda入门demo(2)——最基础的二方向sobel

⚠️主要是自己温习用&#xff0c;只保证代码正确性&#xff0c;不保证讲解的详细性。 今天继续总结cuda最基本的入门demo。很多教程会给你说conv怎么写&#xff0c;实际上sobel也是conv&#xff0c;并且conv本身已经用torch实现了。 之前在课题中尝试了sobel的变体&#xff0…

打造完美美妆体验,化妆品商城软件系统助你一臂之力

化妆品商城软件系统采用先进的前后端分离技术&#xff0c;支持多种语言和数据库&#xff0c;具有良好的扩展性和可维护性。同时&#xff0c;一般系统还提供丰富的功能模块&#xff0c;包括商品管理、订单管理、用户管理、营销推广等&#xff0c;可以满足不同规模的化妆品商城的…

在windows配置redis的一些错误及解决方案

目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口&#xff0c;是可以正常连接的&#xff0c;但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…

关于CPU对Cache的访存操作 浅解

最近在做计算机组成原理关于高速缓存处理器的相关习题&#xff0c;由于一开始没有完全理解导致做题时特别崩溃。在做错无数次题后我感觉自己有必要总结一下自己对Cache的理解&#xff0c;以防以后再忘记。 一 | 前因 1 为什么需要Cache? 首先我们需要明白为什么需要使用Cac…

Unity Shader:闪烁

还是一样的分为UI闪烁和物体闪烁,其中具体可分为:UI闪烁、物体闪烁与半透明闪烁 1,UI闪烁 对于UI 还是一样的,改写UI本身的shader: Shader "UI/YydUIShanShder" {Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) = "white"…

[PM]敏捷开发之Scrum总结

在项目管理中&#xff0c;不少企业和项目团队也发现传统的项目管理模式已不能很好地适应今天的项目环境的要求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;本文将为大家介绍Scrum敏捷项目管理以及应用方法。 什么是Scrum敏捷项目管理 敏捷项目管理作为新兴的项目管理模…

一键生成动漫头像小程序源码-含搭建教程

这款程序用来做小程序矩阵&#xff0c;非常不错&#xff0c;可以把他放到你的其他小程序里&#xff0c;或者其他程序系统来弥补程序的丰富性&#xff0c;拓展可玩性。 很多抖音直播也在玩这个&#xff0c;玩法很简单&#xff0c;可以去参考那些直播间 这款程序没有后台&#xf…

python_PyQt5开发验证K线视觉想法工具V1.2_批量验证

目录 运行情况&#xff1a; ​编辑 结果json文件格式&#xff1a; 代码&#xff1a; 承接 【python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段】 博文 地址&#xff1a;python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段_程序猿与金融与科技的博客-…

使用node.js 搭建一个简单的HelloWorld Web项目

文档结构 config.ini #将本文件放置于natapp同级目录 程序将读取 [default] 段 #在命令行参数模式如 natapp -authtokenxxx 等相同参数将会覆盖掉此配置 #命令行参数 -config 可以指定任意config.ini文件 [default] authtokencc83c08d73357802 #对应一条隧…

【LeetCode】从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树 题目描述算法分析编程代码 链接: 从中序与后序遍历序列构造二叉树 题目描述 算法分析 编程代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : …

Vulnhub靶机DC-2 writeup

靶机介绍 靶机介绍&#xff1a;https : //download.vulnhub.com/dc/DC-2.zip ​ 信息搜集 获取IP地址 扫描靶机的IP的方法 1. nmap -sP 192.168.142.0/24 #nmap进行ping扫描发现存活主机 2. arp-scan -l #基于ARP发现内网存活主机 3. netdiscover -r 192.168.142.0/24 -…

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…

Vue2 第十七节 Vue中的Ajax

1.Vue脚手架配置代理 2.vue-resource 一.Vue脚手架配置代理 1.1 使用Ajax库 -- axios ① 安装 : npm i axios ② 引入: import axios from axios ③ 使用示例 1.2 解决开发环境Ajax跨域问题 跨域&#xff1a;违背了同源策略&#xff0c;同源策略规定协议名&#xff0…

智能的等价超越了数学的等价

尽管等价关系只是智能的一方面&#xff0c;还有其他一些如语言理解、创造性思维和决策能力等方面都可以作为评估智能的标志。 能否有效产生出等价关系仍然被视为智能出现的最重要标志之一。在认知科学和人工智能领域&#xff0c;智能通常被定义为具备理解、学习、推理和问题解决…

Python系统学习1-3

1、变量 变量&#xff1a;关联一个对象的标识符 学习目标&#xff1a;学会画变量的内存图 命名规则:字母数字下划线&#xff0c;所有单词小写&#xff0c;单词之间下划线隔开 赋值&#xff1a;创建一个变量或改变一个变量关联的数据。 语法&#xff1a;变量名数据&#xf…

【项目流程】前端项目的开发流程

1. 项目中涉及的所有角色及其职责 - PM 产品经理 产品经理&#xff08;Product Manager&#xff0c;简称PM&#xff09;负责明确和定义产品的愿景和战略&#xff0c;与客户、用户、业务部门和其他利益相关者进行沟通&#xff0c;收集并分析他们的需求和期望。负责制定产品的详…