Linux 进程(十) 进程替换

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

        进程属于内核数据结构,所以要对进程做修改只能通过系统调用!

替换函数 

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

#include <unistd.h>`
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

首先我们来演示execl:

     拿execl为例子,如果想让我们的进程中执行ls -a -l 的命令与在命令行解释器上执行出的效果一样,该怎么使用这个函数呢

执行结果: 在我们写的可执行程序中也可以实现在命令行上执行出来的一样的效果。

注意:

  1. 从上面程序的执行结果可以看出,begin打印出来了,但是end并没有打印出来,说明程序一旦替换成功,exec*后续代码不在执行,因为被替换成新的代码了。
  2. exec* 只有失败返回,没有成功返回。
  3. 替换完成,不创建新的进程,我们可以通过查看前后两个进程的pid,发现没有改变,可以说明是一个进程。
  4. 创建一个进程,先创建pcb,地址空间,页表等,然后再把程序加载进来。

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

        最后一个字母p:表示PATH 表示你不用告诉系统绝对或者相对路径,只要告诉系统名字就好。系统替换的时候,会自动去PATH中寻找。

        同时命名中带“l” 的表示list 表示使用时要按照列表的形式传递,也就是一个一个的传,命名中带“v ” 的就是吧要执行的放置在一个指针数组中,然后直接把指针数组的地址传递过去。

        我们我会发现前两个参数都是 “ls” 这重复吗?不重复!!!第一个表示怎么执行程序的名,后面的就是命令行参数怎么写那里就怎么写。这就比如生活中有两个人叫一样的名字,但不能说这两个是同一个人。

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

那么如何让自己写的程序调用自己的程序呢?

首先我们来写一个简单的c++文件。

如何让make 一下生成两个可执行程序呢?

首先定义一个为目标 all 表示 该命令都是被执行,但是没有依赖方法。

如果不这样写的话make 一下只能生成一个可执行程序,因为make 会寻找第一个目标文件 并且编译成为最终文件。

这样make一下会生成两个可执行程序。 

 用我们自己写的c程序调用c++程序。

为什么这样可以呢?不管任何语言写的代码,只要运行起来都是进程!!!!!

当程序执行起来,我们可以发现程序不仅仅能够替换,也能够拿到我们的命令行参数,并且也能够打印出来。 

那么我们在子进程中替换我们的程序,看一看子进程是否会继承父进程的环境变量呢?

#include<iostream>
using namespace std;
#include <unistd.h>

int main(int agrc,char* argv[])
{

  for(int i = 0;environ[i];i++)
  {
    printf("environ[%d]:%s\n",i,environ[i]);
  }

  cout << "hello c++"<<endl;
  cout << "hello c++"<<endl;
  cout << "hello c++"<<endl;
  cout << "hello c++"<<endl;
  cout << "hello c++"<<endl;
  cout << "hello c++"<<endl;
  cout << "hello c++"<<endl;

  return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

int main()
{
  printf("i am a process, pid:%d\n",getpid());
 
  pid_t id = fork();

  if(id == 0){
  execl("./mytest","mytest","-a","-b","-c",NULL);

  printf("############## end   ################\n");
  }

  pid_t rid = waitpid(id,NULL,0);
  if(id > 0)
  {
    printf("wait success:rid:%d\n",rid);
  }
  return 0;
}

通过以上的执行结果我们可以看出子进程确实可以继承父进程的环境变量。

默认可以通过进程地址空间继承的方式,让所有的子进程拿到环境变量。

进程程序替换不会替换环境变量的数据。

综上所诉:子进程默认能够继承父进程的环境变量。

如果要新增环境变量就要使用 putenv

putenv("MYVAL=bbbbbbbbbbbbbbbbbbbbbbbbbbbb");

如果单纯想要子进程继承新的环境变量呢?

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

这时就要使用我们的程序调用函数了,首先我们需要自己定义一个环境变量表,然后使用程序替换的时候传进去。

执行结果如下,这样我们替换的程序就能够拿到我们自己定义的环境变量了 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Bootstrap学习 day13】

Bootstrap5 下拉菜单 下拉菜单通常用于导航标题内&#xff0c;在用户鼠标悬停或单击触发元素时显示相关链接列表。 基础的下拉列表 <div class"dropdown"><button type"button" class"btn btn-primary dropdown-toggle" data-bs-toggl…

虚幻UE 增强输入-第三人称模板增强输入分析与扩展

本篇是增强输入模块&#xff0c;作为UE5.0新增加的模块。 其展现出来的功能异常地强大&#xff01; 让我们先来学习学习一下第三人称模板里面的增强输入吧&#xff01; 文章目录 前言一、增强输入四大概念二、使用步骤1、打开增强输入模块2、添加IA输入动作2、添加IMC输入映射内…

安防监控EasyCVR视频融合/汇聚平台大华热成像摄像机智能告警上报配置步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

第三届先进控制、自动化与机器人国际会议(ICACAR 2024) | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第三届先进控制、自动化与机器人国际会议(ICACAR 2024) 会议时间&#xff1a;2024年5月24-26日 召开地点&#xff1a;中国重庆 大会官网&#xff1a;ICACAR 2024-2024 3rd International Conference on Advanced Control, Automation and Ro…

华为云CES监控与飞书通知

华为云负载均衡连接数监控与飞书通知 在云服务的日常运维中&#xff0c;持续监控资源状态是保障系统稳定性的关键步骤之一。本文通过一个实际案例展示了如何使用华为云的Go SDK获取负载均衡器的连接数&#xff0c;并通过飞书Webhook发送通知到团队群组&#xff0c;以便运维人员…

超维空间M1无人机使用说明书——31、基于模板匹配的物体识别功能

引言&#xff1a;ROS提供的物体识别功能包find_object_2d&#xff0c;该功能包用起来相对简单&#xff0c;只需要简单进行模板匹配即可。需要接显示器进行模板训练&#xff0c;远程比较卡&#xff0c;不建议 一、功能包find_object_2d简介 ROS的优点之一是有大量可以在应用程…

vivado 支持的XDC和SDC命令

支持的XDC和SDC命令 本附录讨论了支持的Xilinx设计约束&#xff08;XDC&#xff09;和Synopsys设计AMD Vivado中的约束&#xff08;SDC&#xff09;命令™ 集成设计环境&#xff08;IDE&#xff09;。 XDC文件中的有效命令 支持的SDC命令 注意&#xff1a;由于所有AMD Tcl命…

基于SSM的人事档案管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【保研记录】2023年(24届)SE上岸经历

先开个坑&#xff0c;慢慢填~ 个人信息 学校&#xff1a;某双非 专业&#xff1a;软件工程 第四轮学科评估&#xff1a;无&#xff08;对就是没有等级&#xff09; 排名&#xff1a;1/400 竞赛/荣誉&#xff1a;国奖x2&#xff0c;省三好&#xff0c;大英国二&#xff0c;…

【uniapp】多规格选择

效果图 VUE <template> <view><view class"wp-80 pd-tb-40 mg-auto"><button type"warn" click"showDrawer(showRight)">筛选</button></view><!-- 筛选-uni-drawer --><uni-drawer ref"s…

为 validator 对象添加链式调用功能,并 return 校验后的值

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 使用 Raise…

JavaScript——BOM中所有对象的常用属性和方法【万字长篇超宝典】

目录 什么是BOM&#xff1f; BOM中的对象 一、window对象 1、控制台打印方法 2、弹窗相关方法 &#xff08;1&#xff09;、alert( )提示框 &#xff08;2&#xff09;、confrim( )交互框 &#xff08;3&#xff09;、prompt( )输入框 3、窗口打开关闭的方法 &#…

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年&#xff0c;最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世&#xff0c;到“千模大战”如火如荼&#xff0c;AIGC正式破圈&#xff0c;成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中&#xff0c;通过调研235家企业可知&#xff0…

所有单片机使用的汇编语言是统一的吗?

所有单片机使用的汇编语言是统一的吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)主线程反应堆模型的事件添加和处理详解

>>服务器和客户端建立连接和通信流程&#xff1a; 基于多反应堆模型的服务器结构图&#xff0c;这主要是一个TcpServer&#xff0c;关于HttpServer,主要是用了Http协议&#xff0c;核心模块是TcpServer。这里边有两种线程&#xff1a;主线程和子线程。子线程是在线程池里…

windows 10 安装wsl ubuntu

1.首先管理员模式打卡powershell&#xff0c;执行 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 2.执行 wsl --update wsl --…

静态网页设计——崩坏3(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; 使用技术&#xff1a;HTMLCSSJS&#xff08;静态网页设计&#xff09; 主要内容&#xff1a;对游戏崩坏3进行简单介绍。 https://www.bilib…

Spring声明式事务业务bug

Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA) 等事务 API&#xff0c;实现了一致的编程模型&#xff0c;而 Spring 的声明式事务功能更是提供了极其方便的事务配置方式&#xff0c;配合 Spring Boot 的自动配置&#xff0c;大多数 …

openGauss + Datakit

openGauss Datakit 1. 简介1.1 openGauss1.2 Datakit 2. 环境准备2.1 支持系统2.2 安装包获取2.3 注意事项2.4 系统环境设置 3. openGauss 安装3.1 创建用户和组3.2 创建工作目录3.3 关闭HISTORY记录/关闭交换内存3.4 解压安装包3.5 安装3.6 启动数据库3.7 连接数据库3.8 添加…

数据库设计——DQL

D Q L \huge{DQL} DQL ⭐⭐⭐⭐⭐ DQL&#xff1a;数据库查询语言&#xff0c;用来查询数据库中的记录&#xff0c;非常的重要&#xff0c;对于数据库的操作修改相对来讲还是较少部分&#xff0c;绝大多数操作都是数据查询。 整体的语法结构&#xff1a; 基本查询 示例&#…