Linux进程控制——Linux进程程序替换

前言:Linux进程控制包含了进程终止,进程等待,进程程序替换。走到现在我们也只剩下进程程序替换没介绍了,那么让我们来看看进程程序替换到底是什么!


在这里插入图片描述


本篇主要内容:
替换原理
替换函数
实现简易shell

在这里插入图片描述


我们所创建的所有的子进程,执行的代码,都是父进程代码的一部分,如果我们想让子进程执行新的程序,执行全新的代码和访问全新的数据,不在和父进程有瓜葛这就要用到我们的进程替换了!!!


进程程序替换

  • 1. 替换原理
  • 2. 替换函数
    • 2.1 execl类型函数
    • 2.2 execv类型函数
  • 3. 实现简易shell
  • 4. 总结


1. 替换原理

我们先介绍一个exec函数,方便我们读下面的代码
execl:
在这里插入图片描述
我们直接来看代码分析:

  1 #include <stdio.h>2 #include <sys/types.h>                                                                                                                                                                 3 #include <unistd.h>4 #include <wait.h>5 int main()6 {7     pid_t id = fork();8     if(id == 0)9     {10         printf("pid: %d, exec command begin\n", getpid());11         sleep(2);12         execl("/usr/bin/ls", "ls", "-a", "-l", NULL);13         printf("pid: %d, exec command end\n", getpid());14     }15     else{16         pid_t rid = waitpid(-1, NULL, 0);17         if(rid > 0)18         {19             printf("wait success, pid: %d\n", rid);20         }21     }22     return 0;23 }

在这里插入图片描述

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

  • 操作系统在调用exec函数时,只要将整个进程的代码和数据用新程序的代码和数据进行替换。
  • 子进程往往会共享父进程的代码和数据,因为有写时拷贝的技术,有新数据写入时,会重新开辟空间所以不会相互影响,保证父子进程的独立性。

在这里插入图片描述


但是我们仔细查看代码和执行结果后发现,竟然有一段代码没有执行!

13  printf("pid: %d, exec command end\n", getpid());

其实是调用exec程序替换,只要exec替换新程序成功了,子进程就回去执行新的程序,因此后面的代码将不会被执行


2. 替换函数

在进程程序替换中,替换函数必不可少,让我们来看看这类函数!

在这里插入图片描述

RETURN VALUE:
The exec() functions error has occurred return only if an The return value is -1 and errno to indicate the error

而exec开头的函数一共介绍6种,它们只会在出错时返回 -1!

我们以一下两点来理解:

  • 必须先找到这个可执行程序怎么执行
  • 必须告诉exec,怎么执行*

2.1 execl类型函数

在这里插入图片描述
在这里插入图片描述

execl我们在上面简单了解了,我们就介绍一下剩下两个

execlp:
在这里插入图片描述

int main()
{{printf("pid: %d, exec command begin\n", getpid());sleep(2);execlp("ls", "ls", "-a", "-l", NULL);  //第一个ls代表怎么找到这个程序 //第二个ls其实是命令的一部分,对应怎么执行                                                                                                                                    printf("pid: %d, exec command end\n", getpid());}                                              return 0;                          
}  

在这里插入图片描述

在使用execlp函数时,我们并没有加上路径,但是我们依然能够获得想要的结果,正是因为p代表了PATH他会自动去环境变量PATH中根据file来寻找可执行程序!!!


execlpe:
在这里插入图片描述

// mytest源代码
int main()
{char *const myenv[] = {"myenv1=2004","myenv2=2005","myenv3=2005","myenv4=2005",NULL};                                                                                                                                                                               printf("exec command begin\n");execle("./myprocess", "myprocess", NULL, myenv);// myprocess源代码
int main(int agrc, char *agrv[], char *env[])
{for(int i = 0; env[i]; i++){printf("[%d]: %s\n", i, env[i]);}return 0;
} 

在这里插入图片描述
这是exec*函数程序替换,我们在下文会讲


2.2 execv类型函数

execv其实就是在execl的基础上多了一个指针数组,情况大差不差我们就不具体介绍了!具体关系如下图:
在这里插入图片描述

在这里插入图片描述
execv 和 execvp:
在这里插入图片描述

int main()
{char *const argv[] = {"ls","-a","-l",NULL};printf("pid: %d, exec command begin\n", getpid());sleep(2);execv("/usr/bin/ls", argv);       //execvp("ls", argv);                                                                                                                         printf("pid: %d, exec command end\n", getpid());  return 0;                          
}  

在这里插入图片描述

其实exec这类函数命令有一定的规律:

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

在这里插入图片描述


3. 实现简易shell

我们用程序替换是可以用C语言把C++调用起来的

// test.c
int main()
{printf("pid: %d, exec command begin\n", getpid());execl("./myprocess", "myprocess", NULL);                                                                                                                               return 0;
}// test.cc
int main()
{std::cout << "hello c++" << std::endl;std::cout << "hello c++" << std::endl;std::cout << "hello c++" << std::endl;std::cout << "hello c++" << std::endl;                                                                                                                                             return 0;
}

Makefile:

.PHONY:allall:mytest myprocessmyprocess:test.ccg++ -o $@ $^ -std=c++11mytest:test.cgcc -o $@ $^ -std=c99.PHONY:clean
clean:rm -f mytest myprocess 

因为我们要同时编译两个程序,所以我们要对Makefile进行一下调整

在这里插入图片描述

我们通过程序替换将C++用C语言调用起来了


那我们除了调用C++还能调用别的嘛?

  • 显而易见当然是可以的!!!
// test.sh
// 会简单编写就好
#!/usr/bin/bash
echo "hello Linux"
echo "hello world"
touch code// test.c
int main()
{printf("pid: %d, exec command begin\n", getpid());execl("/usr/bin/bash", "bash", "test.sh", NULL);                                                                                                                               return 0;
}

在这里插入图片描述

当然除了我们讲的这两个,其实所有语言都能通过进程程序替换来调用,因为我们用任意语言写的程序都会变成进程,只要是进程就都可以用exec*来替换——系统大于一切


4. 总结

进程程序替换能够让我们只用C语言就可以调用其他任何语言去执行,极大程度上带来了便利,也可以帮助我们完成很多任务,好了,关于Linux进程控制我们先了解到这,下次我们将进入新的章节!

谢谢大家支持本篇到这里就结束了
在这里插入图片描述

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

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

相关文章

Broad Learning System (BLS) 宽度学习系统

宽度学习&#xff08;Broad Learning System, BLS&#xff09;是一种有效的神经网络学习框架&#xff0c;旨在通过扩展网络的宽度而不是深度来提高学习能力和效率。与传统的深度学习相比&#xff0c;宽度学习通过堆叠多层特征节点和增强节点来构建网络&#xff0c;从而避免了深…

Maven依赖管理项目构建

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图&#xff08;了解&#xff09; 二、Maven安装和配置1. Mave…

PostgreSQL扩展之PGroonga:多语言全文搜索

简介 PGroonga 是一个 PostgreSQL 扩展&#xff0c;它增加了基于 Groonga 的全文搜索索引方法。虽然原生的 PostgreSQL 支持全文索引&#xff0c;但它仅限于基于字母和数字的语言。PGroonga 提供了更广泛的字符支持&#xff0c;使其成为 PostgreSQL 支持的语言的超集&#xff…

(实测验证)Gitee代码托管尝试(一)——克隆/下载

一、登录 Gitee&#xff08;码云&#xff09;代码托管平台&#xff1a; Gitee - 基于 Git 的代码托管和研发协作平台 新建个人账户如下&#xff1a; 二、SSH 公钥设置 1、在git安装目录打开“git-cmd.exe”; 2、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen …

Linux进程概念总结

这里总结下Linux进程概念总结❗ 冯诺依曼&#xff1a; CPU 运算器与控制器RAM 内存&#xff08;存储器&#xff09;Cache 缓存&#xff08;一种技术&#xff09;不属于冯诺依曼体系结构。ROM 磁盘&#xff08;输入输出设备&#xff09;磁盘 既可以从硬盘读取数据也可以向硬盘…

3-3 基于RYU的流量风暴事件原理与响应策略

在传统网络中&#xff0c;存在着一定的广播流量&#xff0c;占据了一部分的网络带宽。同时&#xff0c;在有环的拓扑中&#xff0c;如果不运行某些协议&#xff0c;广播数据还会引起网络风暴&#xff0c;使网络瘫痪。 如有以下的一个网络拓扑结构&#xff08;3_2_topoplus.py) …

es 分词器(五)之elasticsearch-analysis-jieba 8.7.0

es 分词器&#xff08;五&#xff09;之elasticsearch-analysis-jieba 8.7.0 今天咱们就来讲一下es jieba 8.7.0 分词器的实现&#xff0c;以及8.x其它版本的实现方式&#xff0c;如果想直接使用es 结巴8.x版本&#xff0c;请直接修改pom文件的elasticsearch.version版本号即可…

再谈毕业论文设计投机取巧之IVR自动语音服务系统设计(信息与通信工程专业A+其实不难)

目录 举个IVR例子格局打开&#xff0c;万物皆能IVR - 把《民法典》搬上IVR IVR系统其实可盐可甜。还能可圈可点。 戎马一生&#xff0c;归来依然IVR。 举个IVR例子 以下是IVR系统的一个例子。 当您拨打电话进入IVR系统。 首先检验是否为工作时间。 如是&#xff0c;您将被送入…

基于51单片机的自动浇花器电路

一、系统概述 自动浇水灌溉系统设计方案&#xff0c;以AT89C51单片机为控制核心&#xff0c;采用模块化的设计方法。 组成部分为&#xff1a;5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块&#xff0c;结构如…

垃圾分类管理系统java项目

文章目录 垃圾分类管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 垃圾分类管理系统 一、项目演示 垃圾分类管理系统 二、项目介绍 系统角色&#xff1a;管理员、用户 1、登录、注册功能…

机器人非线性系统反馈线性化与解耦

机器人非线性系统的反馈线性化和解耦是控制理论中的两个重要概念&#xff0c;它们分别用于简化系统分析和设计过程&#xff0c;提高控制系统的性能。 首先&#xff0c;反馈线性化是一种将非线性系统转化为线性系统的技术。在机器人控制中&#xff0c;由于机器人本身是一个强耦…

​python使用selenium进行Web自动化测试​

什么是selenium Selenium 是 ThoughtWorks 提供的一个强大的基于浏览器的 Selenium 是一个用于 Web 应用程序测试的工具&#xff0c;测试直接自动运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持的浏览器包括 IE、Chrome 和 Firefox 等。这个工具的主要功能包…

2024042001-计算机网络 - 物理层

计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向&#xff0c;分为以下三种通信方式&#xff1a; 单工通信&#xff1a;单向传输半双工通信&#xff1a;双向交替传输全双工通信&#xff1a;双向同时传输 带通调制 模拟信号…

C++基础——继承(下)

一、继承与静态成员 基类定义了static 静态成员&#xff0c;则整个继承体系里面只有一个这样的成员。无论派生出多少个子 类&#xff0c;都只有一个 static 成员实例 。 class person { public:person(const char* name "lisi"):_name(name){} public:string _name;…

那些年我与c++的叫板(一)--string类自实现

引子&#xff1a;我们学习了c中的string类&#xff0c;那我们能不能像以前数据结构一样自己实现string类呢&#xff1f;以下是cplusplus下的string类&#xff0c;我们参考参考&#xff01; 废话不多说&#xff0c;直接代码实现&#xff1a;&#xff08;注意函数之间的复用&…

Nacos+GateWay 搭建微服务架构

文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口&#xff08;开发环境…

汇聚荣科技:拼多多上架商品后需要做页面推广吗?

在电商平台上&#xff0c;商品的曝光率和销量往往成正比。那么&#xff0c;当您在拼多多上架了新品&#xff0c;是不是就意味着坐等订单呢?答案显然是否定的。商品一旦上架&#xff0c;接下来需要做的就是通过有效的页面推广来增加商品的可见度&#xff0c;吸引潜在买家的注意…

html基础(全)

html简介 目录 什么是网页 什么是 HTML 常用浏览器 WebE标准的构成 基本语法概述 第一个HTML页面 文档类型声明标签 lang 语言种类 字符集 标题标签 段落和换行标签 文本格式化标签 div和span标签 图像标签和路径 超链接标签 表格的主要作用 表头单元格标签 列…

纯血鸿蒙APP实战开发——Web获取相机拍照图片案例

介绍 本示例介绍如何在HTML页面中拉起原生相机进行拍照&#xff0c;并获取返回的图片。 效果预览图 使用说明 点击HTML页面中的选择文件按钮&#xff0c;拉起原生相机进行拍照。完成拍照后&#xff0c;将图片在HTML的img标签中显示。 实现思路 添加Web组件&#xff0c;设置…