Linux 进程(十) 进程替换

news2024/11/17 17:28:22

        用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[]);

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

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

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

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

相关文章

stable diffusion 人物高级提示词(四)朝向、画面范围、远近、焦距、机位、拍摄角度

一、朝向 英文中文front view正面Profile view / from side侧面half-front view半正面Back view背面(quarter front view:1.5)四分之一正面 prompt/英文中文翻译looking at the camera看向镜头facing the camera面对镜头turned towards the camera转向镜头looking away from …

c语言题目之统计二级制数中1的个数

文章目录 题目一、方法1二、方法2三&#xff0c;方法3总结 题目 统计二进制数中1的个数 输入一行&#xff0c;输出一行 输入&#xff1a; 输入一个整数 输出&#xff1a; 输出存储在内存中二进制的1的个数 一、方法1 之前的文章中&#xff0c;小编写了有关于内存在二进制中的存…

基于YOLOv7算法的高精度实时安全背心目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时安全背心目标检测系统可用于日常生活中检测与定位安全背心&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训…

flutter 五:MaterialApp

MaterialApp const MaterialApp({super.key,this.navigatorKey, //导航键this.scaffoldMessengerKey, //scaffold管理this.home, //首页Map<String, WidgetBuilder> this.routes const <String, WidgetBuilder>{}, //路由this.initialRoute, //初始路由th…

四种“栈溢出检测方法”实现分析(2种纯软件、一种纯硬件、一种软硬件结合)

1、两种纯软件的栈溢出检测方法 参考博客&#xff1a;《freeRTOS的栈溢出检测机制》&#xff1b; 2、纯硬件&#xff1a;使用栈限制寄存器 2.1、工作逻辑分析 前提条件&#xff1a;使用满减栈硬件上提供栈限制寄存器&#xff08;用SP_limit表示&#xff09;&#xff0c;可以…

互联网广告行业发展历程

在20年的历程中&#xff0c;广告主与媒体方持续面对着一些问题&#xff0c;一些核心问题推动了行业的迭代。 互联网广告经过了20年左右的高速发展&#xff0c;已愈发成熟&#xff0c;其历程是有趣的。 对互联网广告发展的理解&#xff0c;网上的文章并不多&#xff0c;已有的…

AIGC初探:提示工程 Prompt Engineering

简介 提升工程是什么 提示工程&#xff08;Prompt Engineering&#xff09;是人工智能领域中的一个概念&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域中。它是一种通过设计和优化输入提示来提高AI模型表现的方法。 对于基于转换器的大型语言模型&#x…

无监督学习(K-Means)的认识

目录 一、无监督学习 二、无监督学习和有监督学习的区别 三、K-Means 3.1数据分析 3.2k-meas算法 3.3数据正态化后k-means 3.4找最佳k&#xff08;Elbow Plot&#xff09; 四、k-means算法的优缺点 一、无监督学习 无监督学习是一种机器学习的方法&#xff0c;…

机器学习--回归算法

&#x1f333;&#x1f333;&#x1f333;小谈&#xff1a;一直想整理机器学习的相关笔记&#xff0c;但是一直在推脱&#xff0c;今天发现知识快忘却了&#xff08;虽然学的也不是那么深&#xff09;&#xff0c;但还是浅浅整理一下吧&#xff0c;便于以后重新学习。 &#x1…

Eclipse设置不依赖系统环境变量,设置lombok

设置不依赖系统环境变量&#xff0c;如图首行添加 -vm. lombok配置在最后两行

企业老旧档案怎么处理?

不管选择何种处理方式处理企业老旧档案&#xff0c;都要先制定一份详细的档案处理计划&#xff0c;明确处理的目标、方式和时间&#xff0c;并确保有足够的人力和物力资源来完成处理工作。 一般来说&#xff0c;常用的企业老旧档案有以下几种方法&#xff1a; 1. 整理归档&…

半导体Memory的分类

文章目录 略图introRAM & ROM 略图 intro 存储器是嵌入式系统中用于存放数据和程序的模块。有些存储器是MCU内置的&#xff0c;有些是扩展的。 存储器嵌入式系统中常见且重要的外设模块。搞清楚存储器的分类是从事嵌入式开发工作的一项基本功。 从功能上&#xff0c;存储器…

2023高级人工智能期末总结

1、人工智能概念的一般描述 人工智能是那些与人的思维相关的活动&#xff0c;诸如决策、问题求解和学习等的自动化&#xff1b; 人工智能是一种计算机能够思维&#xff0c;使机器具有智力的激动人心的新尝试&#xff1b; 人工智能是研究如何让计算机做现阶段只有人才能做得好的…

DNs服务学习笔记

DNS&#xff1a;域名系统&#xff08;英文&#xff1a;Domain Name System)是一个域名系统&#xff0c;是万维网上作为域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使用户更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。类似于生活中的11…

基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码

基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于帝国主义竞争优化的Elman网络5.测试结果6.参考文献7.Matl…

P11 FFmpe时间基和时间戳

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

C/C++输入函数总结

1、cin 2、cin.get 3、cin.getline 4、getline 5、gets 6、getchar 1、cin 可以接受单个字符和字符串&#xff0c;但遇空格,"TAB","回车"结束&#xff01;&#xff01;&#xff01; 若不跳过空白字符&#xff0c;使用 noskipws 流控制。 使用方法如…

数据结构学习 jz56数组中数字出现的次数

关键词&#xff1a;位运算 异或性质 虽然有两道题&#xff0c;但是其实应该分成三个级别的题目。 题目一&#xff1a; 一个整型数组 sockets 里除 一个 数字之外&#xff0c;其他数字都出现了两次。 思路&#xff1a;异或的性质 复杂度计算&#xff1a; 时间复杂度O(n) 空…

C语言全面学习基础阶段01—C生万物

如何学好 C 语言 1. 鼓励你&#xff0c;为你叫好。 C 生万物 编程之本 长远 IT 职业发展的首选 C 语言是母体语言&#xff0c;是人机交互接近底层的桥梁 学会 C/C &#xff0c;相当于掌握技术核心 知识点一竿子打通。 IT 行业&#xff0c;一般每 10 年就有一次变革 40 年间&a…

智慧校园全空间三维电子沙盘系统

一、概述 易图讯科技&#xff08;www.3dgis.top&#xff09;采用大数据、云计算、虚拟现实、物联网、AI等先进技术&#xff0c;自主可控高性能WebGIS可视化引擎&#xff0c;支持多用户客户端通过网络请求访问服务器地图和专题数据&#xff0c;提供地理信息数据、专题数据的并发…