【进程替换】多进程程序替换原理 | 进程程序替换函数 | execlexecv | execlpexecvp

目录

多进程程序替换

多进程程序替换原理

进程程序替换函数详解

execl&execv

execlp&execvp

execle&execvpe 

execve


多进程程序替换

  • 我们想要进程替换的同时不影响旧的进程(使用多进程版)
  • fork创建子进程,让子进程去替换执行新程序(因为替换进程本身不会创建新的进程)
  • 父进程依旧执行旧的进程,且等待子进程(非阻塞等待)
  • 父进程只等待子进程(阻塞等待)
  • 子进程可以替换系统指令,也可以替换我们自己的程序,只要是一个可执行程序都可以替换。
  • 两全其美:既让子进程完成了任务,又不能让父进程受到影响

说明fork创建子进程完成任务:

  • 让子进程执行父进程代码的一部分
  • 让子进程执行一个全新的程序
  • 基于进程间的独立性原则。
  • fork创建的子进程默认在不修改的前提下,父子进程的数据和代码时共享的。
  • 子进程发生了进程替换,相当于发生写入,发生了写时拷贝。
  • 执行一个全新的程序,父子进程是独立的,所以不仅数据要写时拷贝,代码也要发生写时拷贝。只要程序替换成功了,父子进程无论是代码/数据在内核数据结构层面上,数据代码层面上彻底分开了。

子进程发生程序替换:

  • 共享父进程的数据代码
  • 暂停了把新程序的代码和数据从磁盘到内存的加载/写入
  • 发生写时拷贝
  • 开启加载/写入(页表的权限会改变)
  • 重新建立映射关系
 1: testexec.c 1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h>6 7 int main()8 {9   printf("testexec.... begin!\n");10   pid_t id = fork();11   if(id == 0)12   {13     //child14     sleep(2);15     execl("/usr/bin/ls","ls","-l","-a",NULL);                                                            16     exit(1);17   }18   //father19   int status = 0;20   pid_t rid = waitpid(id,&status,0);21   if(rid > 0)22   {23     printf("father wait success!,child exit code: %d\n",WEXITSTATUS(status));24   }25   printf("testexec... end!\n");26   return 0;27 }//测试失败
execl("/usr/bin/lsss","lsss","-l","-a",NULL);    

【测试成功】细看退出码

【测试失败】细看退出码

 

多进程程序替换原理

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

进程程序替换函数详解

前篇粗略的介绍了下替换函数,现在一个一个详解介绍。使用所有的替换方法,并且认识函数参数的含义

  • OS中默认进程程序替换函数有6个库函数和1个系统调用函数。
  • 其实有六种以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[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
//系统调用函数
int execve(const char *path, char *const argv[], char *const envp[]);

execl&execv

  • l:list列表
  • int execl(const char *path, const char *arg, ...); 
  • path:表示替换程序的路径(绝对/相对路径均可)☞☞怎样找到可执行程序需告知
  • arg:可变参数,在命令行中怎么执行,就怎么传参。☞☞你想怎么执行
  • arg形成命令行参数表传给ls指令的可执行程序main函数接收使用
  • 注意❗最后必须以NULL结尾

  • V:Vector动态数组
  • int execv(const char *path, char *const argv[ ]);
  • path:表示替换程序的路径(绝对/相对路径均可)☞☞怎样找到可执行程序需告知
  • argv:指针数组(可变参数与其一个一个传参,直接放到数组里面,传数组即可)(带入命令行参数表)
  • argv被当作命令行参数表传给ls指令的可执行程序main函数接收使用
  • 字符串的类型是const char*变成char*需要强转
  • 注意❗最后必须以NULL结尾
  • 这两个函数只是在传参形式上发生了变化,实际上没有区别。
  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h>6 7 int main()8 {9   printf("testexec.... begin!\n");10   pid_t id = fork();11   if(id == 0)12   {13     //child14     sleep(2);15     execl("/usr/bin/ls","ls","-l","-a",NULL);  //❗                                                          16     exit(1);17   }//1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h>6 7 int main()8 {9   printf("testexec.... begin!\n");10   pid_t id = fork();11   if(id == 0)12   {13     //child14     sleep(2);15     char *const argv[] =16     {17       (char*)"ls",18       (char*)"-l",                                                                                       19       (char*)"-a",20       (char*)"--color",21       NULL22     };23     execv("/usr/bin/ls",argv); //❗24     exit(1);25   }26   //father27   int status = 0;28   pid_t rid = waitpid(id,&status,0);29   if(rid > 0)30   {31     printf("father wait success!,child exit code: %d\n",WEXITSTATUS(status));32   }33   printf("testexec... end!\n");34   return 0;                                                                                              35 }

execlp&execvp

  • p:环境变量PATH
  • 带p的函数不用带绝对/相对路径传递参数了,表示用户可以不传递替换程序的路径(但是要传递可执行程序的文件名file)
  • 用户可以不传递要执行的文件路径(文件名要传),直接告诉exec*,我要执行谁即可。
  • p:查找这个程序,系统会自动在环境变量PATH中进行查找。
  • int execlp(const char *file, const char *arg, ...);
  • int execvp(const char *file, char *const argv[ ]);
 1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h>6 7 int main()8 {9   printf("testexec.... begin!\n");10   pid_t id = fork();11   if(id == 0)12   {13     //child14     sleep(2);15     execlp("ls","ls","-l","-a",NULL);  //❗                                                          16     exit(1);17   }//1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h>6 7 int main()8 {9   printf("testexec.... begin!\n");10   pid_t id = fork();11   if(id == 0)12   {13     //child14     sleep(2);15     char *const argv[] =16     {17       (char*)"ls",18       (char*)"-l",                                                                                       19       (char*)"-a",20       (char*)"--color",21       NULL22     };23     execvp("ls",argv); //❗24     exit(1);25   }26   //father27   int status = 0;28   pid_t rid = waitpid(id,&status,0);29   if(rid > 0)30   {31     printf("father wait success!,child exit code: %d\n",WEXITSTATUS(status));32   }33   printf("testexec... end!\n");34   return 0;                                                                                              35 }

execle&execvpe 

  • e:environment环境变量
  • int execle(const char *path, const char *arg, ...,char *const envp[ ]);
  • int execvpe(const char *file, char *const argv[ ],char *const envp[ ]);

  • bash有环境变量,也可以获取命令行参数
  • bash创建父进程
  • fork创建子进程
  • 通过exec*等函数将环境变量表和命令行参数表交给可执行程序
  • 子进程运行起来,并使用两张表

execve

🙂感谢大家的阅读,若有错误和不足,欢迎指正。 下篇收尾❗

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

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

相关文章

大模型在智能客服领域的应用思考

前言 随着大模型技术的飞速发展,其在商业化应用的落地实践上仍面临着挑战,不论是面向C端用户的付费服务模式,还是面向B端企业的业务赋能策略,目前都尚未形成成熟且清晰的商业模式。 在我所专注的智能客服领域,作为人工智能落地应用的前沿阵地,我深刻感受到大模型的生成…

面试集中营—Redis面试题

一、Redis的线程模型 Redis是基于非阻塞的IO复用模型&#xff0c;内部使用文件事件处理器&#xff08;file event handler&#xff09;&#xff0c;这个文件事件处理器是单线程的&#xff0c;所以Redis才叫做单线程的模型&#xff0c;它采用IO多路复用机制同时监听多个socket&a…

gorm-sharding分表插件升级版

代码地址&#xff1a; GitHub - 137/gorm-sharding: Sharding 是一个高性能的 Gorm 分表中间件。它基于 Conn 层做 SQL 拦截、AST 解析、分表路由、自增主键填充&#xff0c;带来的额外开销极小。对开发者友好、透明&#xff0c;使用上与普通 SQL、Gorm 查询无差别.解决了原生s…

爬虫学习--5.xpath数据解析

xpath是XML路径语言&#xff0c;它可以用来确定xml文档中的元素位置&#xff0c;通过元素路径来完成对元素的查找。HTML就是XML的一种实现方式&#xff0c;所以xpath是一种非常强大的定位方式。 基本概念 XPath&#xff08;XML Path Language&#xff09;是一种XML的查询语言…

03.进程

并发 进程是运行起来的程序&#xff0c;是OS&#xff08;操作系统&#xff09;进行资源分配和调度的基本单位。 当只有一个cpu&#xff0c;进程遇到阻塞事件的时候&#xff08;可能是要去磁盘中读取数据&#xff09;&#xff0c;我们知道cpu的执行速度和磁盘的IO速度相差特别大…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前&#xff0c;先了解一下声波的概念以及超声波和声波之间的关系 什么是声波&#xff1f; 声波是物体机械振动状态&#xff08;或能量&#xff09;的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式&#xff0c;这种振动状…

2023盘古石晋级赛 移动终端取证 WP

9. 根据容恨寒的安卓手机分析&#xff0c;MAC的开机密码是[答案&#xff1a;asdcz] 到这里火眼就寄了&#xff0c;盘古石 启动&#xff01; 10. 根据容恨寒的安卓手机分析&#xff0c;苹果手机的备份密码前4位是[答案&#xff1a;1234] 11. 根据魏文茵苹果手机分析&#xff0c…

找不到vcruntime140_1.dll怎么办,介绍5种简单有效的解决方法

当您的电脑系统提示找不到vcruntime140_1.dll文件时&#xff0c;这通常意味着系统在尝试运行某个应用程序或游戏时&#xff0c;无法定位到这个至关重要的动态链接库&#xff08;DLL&#xff09;文件。此情况可能源于几个不同的原因&#xff0c;包括但不限于&#xff1a;文件被误…

电信网关配置管理系统 rewrite.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

三分钟上手安全渗透系统Kali Linux

kali linux系统集成了常用的安全渗透工具&#xff0c;省去了安装工具的时间&#xff0c;做安全相关的工作是非常推荐使用的。 安装Kalii Linux 安装系统 一般使用虚拟机进行安装&#xff0c;Kali Linux基于Debian内核&#xff0c;虚拟机的操作系统选择Debian 7.x 64 选择系统…

C++入门 string类(第二章):string类对象的容量操作

文章目录 &#x1f680;1. string类对象的容量操作⚡️1.1 size⚡️1.2 capacity⚡️1.3 max_size⚡️1.4 resize⚡️1.5 reserve⚡️1.6 clear⚡️1.7 empty &#x1f680;2. string类对象访问元素⚡️2.1 at⚡️2.2 back 与 front &#x1f680;3. string类对象的字符串操作&…

嵌入式学习<1>:建立工程、GPIO和keil仿真

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程_新建工程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开…

海睿思受邀参加 “走进中节能”研习交流,探索新能源数据治理的创新路径

近日&#xff0c;OceanMind海睿思参加由江苏省企业信息化协会&#xff08;以下简称“苏信会”&#xff09;主办的“走进中节能太阳能科技&#xff08;镇江&#xff09;有限公司”研习交流活动。 海睿思与苏美达、远东控股、隆基乐叶、固德威、上能电气等40多位来自制造业领域的…

VMware Workstation 17 Player 创建虚拟机教程

本教程是以windows server 2012物理机服务器安装好的VMware Workstation 17 Player为例进行演示&#xff0c;安装VMware Workstation 17 Player大家可以自行网上搜索安装。 1、新建虚拟机 双击安装好的VMvare图标&#xff0c;点击创建虚拟机。 2、选择是否安装系统 本步骤选…

socks5代理的工作原理是什么?

SOCKS5代理是一种采用SOCKS协议的代理服务器&#xff0c;是一种通用的代理服务器。SOCKS5代理服务器可以在前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器能够访问Internet网中的服务器&#xff0c;同时提供更加安全的通讯方式。那么&#xff0c…

解决参考文献自动生成标号,换行时自动缩进

问题如下图所示&#xff0c;红色方框部分应该填充内容&#xff0c;但自动生成标号时不会填充&#xff1a; 解决方案&#xff1a; 1. 选中内容&#xff1a; 2. 找到布局-段落&#xff1a; 3. 选择“无”&#xff0c;即可。

苹果电脑免费第三方软件CleanMyMac X2025电脑版垃圾清理软件神器

Mac电脑用户在长时间使用电脑之后&#xff0c;时常会看到“暂存盘已满”的提示&#xff0c;这无疑会给后续的电脑使用带来烦恼&#xff0c;那么苹果电脑暂存盘已满怎么清理呢&#xff0c;下面将给大家带来一些干货帮你更好地解决这个问题。 CleanMyMac X2024全新版下载如下: h…

开源交互审计系统:功能强大、安全好用【送源码】

在当今信息化时代&#xff0c;网络安全越来越受到重视。传统的远程控制工具&#xff0c;如RDP、SSH、VNC等&#xff0c;虽然方便易用&#xff0c;但存在安全隐患&#xff0c;容易被黑客利用。很多时候我们都需要做一些防护的处理来来保障网络安全。 今天了不起来分享一款开源好…

27、Qt自定义标题栏

一、说明 QtWidget及其子类有默认的标题栏&#xff0c;但是这个标题栏不能美化&#xff0c;有时候满足不了我们的使用需求&#xff0c;所以进行自定义标题栏 二、下载图标 在下面的链接中下载两种颜色的最大化、向下还原、最大化和关闭八个图片&#xff0c;并找一张当做图标…

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1&#xff0c;概述 2&#xff0c;识别预测通路 3&#xff0c;连续的信号转导 4&#xff0c;预测空间共定位细胞群之间的关键信号转导事件…