武汉建站之星信息科技有限公司/安徽seo网络优化师

武汉建站之星信息科技有限公司,安徽seo网络优化师,国外做网站用的程序,网站开发预算怎么算目录 前言 一 进程程序替换的概念 二 进程程序替换的原理 三 为什么需要进行进程程序替换 四 如何进行进程程序替换 1. 进程替换函数 ➊ execl()函数 ➋execv()函数 ➌execlp()函数 ➍execle()函数 ➎execve()* 前言 一般情况下,对应的语言写的程序只…

目录

前言 

一 进程程序替换的概念

二 进程程序替换的原理

三 为什么需要进行进程程序替换

四 如何进行进程程序替换 

1. 进程替换函数

➊ execl()函数

 ➋execv()函数

➌execlp()函数 

 ➍execle()函数

➎execve()* 


前言 

一般情况下,对应的语言写的程序只能调用对应的语言的接口,对于其它类型的语言的接口,如C++就不能 调用java或者python的接口,那如果我们想要调用别人的接口怎么办?所以进程程序替换就能很好的解决这个问题,这样我们就可以使用现成其他语言接口的程序而不用费力地去再实现一个,很大程度上能减少我们的编程成本。


一 进程程序替换的概念

进程程序替换按照字面意思理解就是使用一个新的程序来替换掉原来的程序,此时进程将执行新程序的代码,而不再执行原有程序的代码。一般情况下,我们都是在父进程中fork一个子进程出来,让子进程去执行新程序的代码。


二 进程程序替换的原理

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

假设一开始父子进程都执行的是可执行程序A,如果后面想要执行B程序,那么此时就需要进行进程程序替换,发生替换的时候,操作系统会调用系统调用接口,首先操作系统会将父进程的代码和数据拷贝一份,然后将B程序加载到内存中,重新建立子进程的页表,更新子进程的页表中的映射关系,但是这里修改的只是子进程页表中的物理地址那一栏,此时的父子进程的虚拟地址那一栏还是一样的,只不过操作系统修改了虚拟地址和物理地址之间的映射关系,从而实现了父子进程的代码分离。此时父子进程是互不干扰的。

进程替换后: 

所以进程程序替换就是想让子进程去执行其他磁盘的文件,其本质还是将指定程序的代码和数据加载到指定位置(即覆盖掉原来的自己的代码和数据。) 


三 为什么需要进行进程程序替换

我们在Linux下进行系统编程的时候,我们在创建子进程后,一般是让它执行父进程的代码片段或者让子进程单独去执行磁盘中的其他程序,其他程序可能设计:C/C++、java等不同语言的程序。想让子进程处理后面的事的时候就需要进行进程程序替换。


四 如何进行进程程序替换 

进程程序替换是由操作系统通过调用系统接口来实现的,但是我们需要提前明确一个点,就是使用这些调用接口的注意事项,我们在替换程序的时候,肯定需要知道这个程序在哪里吧,在找到这个程序之后,我们还需要知道如何去执行这个程序,就像shell命令行中输入命令一样,在命令后面可能还带有许多选项。

1. 进程替换函数

操作系统中有着六种以exec开头的函数,统称exec函数

  • 这些函数如果调用成功则加载新的程序从启动代码开始执行。如果调用出错则返回-1;所以说exec()函数只有出错的返回值而没有成功的返回值。 

  • 可以看到这些函数名字都有着很多的共同点:同样都是exec开始的,后面跟不同的字母以表示不同的功能。

  • 再看他们的参数,我们都可以大概猜出来一二,比如path表示替换的程序路径,arg我们在环境变量一篇中见过,表示如何执行该命令,就像shell命令行里命令后跟的选项一样,如 ls -a的“-a”。“...”表示的是可变参数,file表示的是替换程序的文件名,envp表示的是环境变量

  • l(list):表示参数采用列表,

  • v(vector):表示参数使用数组

  • p(path):自动搜索环境变量PATH

  • e(env):表示自己维护环境变量

➊ execl()函数

我们fork()出一个子进程让它去执行shell命令中的ls命令,并且带上选项参数。我们使用execl函数,传的参数是ls命令的路径和可执行命令及选项参数,并且要以NULL结尾(告诉函数传参结束)

运行结果 

✍为什么printf("proces  running done") 没有打印呢

 printf("proces  running done")是在execl之后,execl执行完毕的时候,代码已经完全覆盖,开始执行新的代码的程序,所以printf就无法执行了。

前面也说了这些函数如果调用成功则加载新的程序从启动代码开始执行。如果调用出错则返回-1;所以说exec()函数只有出错的返回值而没有成功的返回值。 那为什么调用成功了没有返回值呢,因为调用成功之后,程序替换之后,不再执行后续代码,所以替换成功之后返回值已经没意义了。

 ➋execv()函数

该函数和execl相比较就差在参数存放的方式,后者是以列表方式存放,而该函数是以数组方式存放(vector)

➌execlp()函数 

该函数和execl()相比就是多了个P,这里的P指的就是PATH,指的是系统直接到环境变量PATH中去寻找对应的程序,所以在第一个参数中我们并不需要传路径。

✉上述操作,我们都是执行系统命令,如果我们想替换自己写的程序,该如何做。 

​  makefile文件(多文件下) 

运行结果 

程序替换:可以使用程序替换,调用任何后端语言对于的任意可执行 

 ➍execle()函数

这个函数与前几个函数相比多了一个e,那么这个e是什么呢?e表示的是环境变量,这个接口的作用是可以给想要执行的程序传入自己定义的环境变量。第三个参数可以覆盖式的将想要传的环境变量传给想要执行的程序,一般两种情况,第一种就是直接传入自定义的环境变量,第二种就是通过environ,并将自定义的环境导出为系统的环境变量

 ​

  • 值得注意的是,execle()函数在传入时,这个环境是覆盖式地传入,并不是新增式地传入,这也就是为什么我们打印出来地只有自己定义的环境变量,因为它们把之前的环境变量都覆盖掉了。

 

如何不覆盖式地添加新的环境变量传给子进程呢? 

➎execve()* 

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

上面的函数本质上都调用了该函数,所以是该函数的封装,是系统真正的调用接口。 

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

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

相关文章

Umi-OCR 全家桶

介绍: 下载 访问官网地址 https://github.com/hiroi-sora/umi-ocrhttps://github.com/hiroi-sora/umi-ocr 点击下载(.exe 文件 安装即可) 桌面使用 安装完毕后去安装路径下点击 Umi-OCR.exe (默认不会生成桌面的快捷方式&…

2023南京理工大学计算机复试上机真题

2023南京理工大学计算机复试上机真题 2023南京理工大学计算机复试机试真题 历年南京理工大学计算机复试上机真题 在线评测:传送门:pgcode.cn 括号匹配二 题目描述 苗苗今天刚刚学会使用括号,不过他分不清小括号,中括号&#…

Axios简单说明,快速上手

Ajax:异步的JavaScript和XML 作用: 数据交换异步交互 Axios:就是对原生Ajax进行封装,简化书写,快速开发 使用逻辑: 首先要安装Axios,可以通过npm在项目中安装: 打开命令行工具…

模型评估——acc、P、R、F值、交叉验证、K折交叉验证

模型评估:对预测函数地预测精度的评估。 多重回归:涉及三个及其以上的变量的回归问题。 评估模型的方法: 交叉验证:将数据集分成测试集和训练集,可以采用3:7或者2:8的比例方式进行划分&#xff…

JVM 2015/3/15

定义:Java Virtual Machine -java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收 数组下标越界检测 多态 比较:jvm/jre/jdk 常见的JVM&…

Compose 实践与探索九 —— DrawModifier 解析

本篇讲解 DrawModifier 的基本用法与代码原理,介绍原理的目的在于可以判断绘制与绘制的关系,绘制与布局的关系。知道达成某种绘制效果应该怎么写,面对复杂的 Modifier 链时对效果有大致预判。 DrawModifier 管理绘制,需要以负责管…

华为手机助手输入连接码时光标乱跳

问题复现:输入12345678,光标自动跳转导致连接码出现乱序情况。 千万别试着找出规律,已试动态规律非大牛误轻试 问题原因: 想啥呢?华哥的软件又不是我开发我要Know Why干啥 我只需关心解决方案 (可能时输入…

Windows 11 安装Docker Desktop环境

1、确认CPU开启虚拟化 打开任务管理器,切换到“性能”选项卡,查看 CPU 信息。若“虚拟化”状态显示为“已启用”,则表示虚拟化已开启;若显示为“已禁用”,则需要在启动时进入 BIOS 开启虚拟化设置(若显示已…

STM32如何精准控制步进电机?

在工业自动化、机器人控制等场合,步进电机以其高精度、开环控制的特性得到了广泛应用。而在嵌入式系统中,使用STM32进行步进电机的精确控制,已成为开发者的首选方案之一。 本文将从嵌入式开发者的角度,深入探讨如何基于STM32 MCU…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JavaWeb 项目的部署:从开发环境到生产环境

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开发环境…

算法题(98):大数加法

审题&#xff1a; 本题需要我们解决大数加法&#xff0c;大数直接运算会超出范围&#xff0c;所以我们需要转换成字符串一位位进行计算 思路&#xff1a; 方法一&#xff1a;高精度加法 我们将两个大数的每一个位分别计算&#xff0c;然后头插到answer字符串中即可 解题&#x…

C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)

BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个&#xff0c;每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍&#xff0c;留下Luck 以及 路由器相关的 端口记录信息。 &#xff08;因为自…

python---序列 (str,list,tuple)

一、 序列类型入门 python的数据类型&#xff1a;int float bool str 运算符 - * / % > < and or not 流程控制ifelsewhilefor掌握python的2大容器类型数值类型&#xff08;3个&#xff09;&#xff1a;int float bool序列类型容器(3个)&#xff1a;str &#xff1a; …

CSS元素层叠顺序规则

CSS元素层叠顺序规则 看图说话总结: background/borderz-index(<0)blockfloatinline/inline-blockz-index(0,auto)z-index (>0)

ArcGIS Pro将有文字标注底图切换为无标注底图(在线地图图源)

今天介绍一下在ArcGIS Pro将有标注的地形底图换成无标注的底图。 大家在这项目底图时候会经常调用ArcGIS Pro自带的地形图&#xff0c;但是这个地形图自带是有注记的&#xff0c;如下图。 如何更改&#xff0c;才可以调用无文字注记的呢&#xff1f; 对于一个已经切好图的有注记…

Xxl-Job学习笔记

目录 概述 核心架构 核心特点 应用场景 什么是任务调度 快速入门 获取源码 初始化调度数据库 基本配置 数据源datasource 邮箱email&#xff08;可选&#xff09; 会话令牌access token 启动调度中心 启动执行器 依赖 yaml基本配置 XxlJobConfig类配置 定义执…

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…

前端工程化之前端工程化详解 包管理工具

前端工程化详解 & 包管理工具 前端工程化什么是前端工程化前端工程化发展脚手架能力 体验度量规范流程效能流程扭转 稳定性建设针对整体稳定性建设 可监控&#xff1a;前端监控系统 包管理工具npm包详解package.jsonname 模块名description 模块描述信息keywords&#xff1…

《Python实战进阶》No24: PyAutoGUI 实现桌面自动化

No24: PyAutoGUI 实现桌面自动化 摘要 PyAutoGUI 是一个跨平台的桌面自动化工具&#xff0c;能够模拟鼠标点击、键盘输入、屏幕截图与图像识别&#xff0c;适用于重复性桌面任务&#xff08;如表单填写、游戏操作、批量文件处理&#xff09;。本集通过代码截图输出日志的实战形…

一周学会Flask3 Python Web开发-SQLAlchemy查询所有数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们来新建一个的蓝图模块-班级模块&#xff0c;后面可以和学生模块&#xff0c;实现一对多的数据库操作。 blueprint下新建g…