Linux进程程序替换

文章目录

  • 进程程序替换
  • 程序替换函数
    • execl()函数
      • 调用另外一个可执行程序
    • execlp()函数
    • ecexv()函数
    • execle()函数
  • 替换函数总结

进程程序替换

什么是进程程序替换?为什么要有程序替换?
顾名思义,进程程序替换就是把该进程中的程序替换掉,那么为什么要把该进程中的程序替换掉呢?因为我们在创建子进程时,想让子进程去做其他的事情,如果直接把子进程要做的事情写在该程序中,会让程序变得很臃肿,而且我们希望子进程可以做很多的事情。

程序替换函数

子进程进行程序替换,一般要使用exec系列的函数。
接下来我们对这个系列的函数使用进行阐述并总结
在这里插入图片描述
通过下面代码我们来依次了解这些函数的使用:
在这里插入图片描述

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

execl()函数

先看使用:
在这里插入图片描述
执行结果:
在这里插入图片描述
对各参数进行说明:
在这里插入图片描述
参数path:要我们说明要调用程序的路径
参数arg:可以看到这里是一个可变参数,第一个参数写命令,后面的写对应的选项,最后要以NULL结尾。通俗来讲就是我们在命令行中怎么写的这里的参数arg就要怎么写,最后再加上NULL即可。比如ls -a -l 这里就写 ls -a -l NULL.

调用另外一个可执行程序

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在可执行程序mytest1中调用可执行程序mytest2

execlp()函数

使用:
在这里插入图片描述
结果
在这里插入图片描述
对参数进行说明:
在这里插入图片描述
参数file:函数execlp中含有p,说明继承的环境变量属性没有被替换,因此无需写路径,指明要执行的程序在哪个文件即可,会自动的在对应的路径下找到这个文件,例如ls在/usr/bin/下的ls文件中,因此当要执行程序ls时,这里的参数就是对应的文件ls
可变参数arg:因为函数名中含有l,意为参数格式为列表,也是按在bash命令下写的这就证明写,最后加上NULL即可。

ecexv()函数

使用1:
注意类型是char* const 而不是const char*
在这里插入图片描述

在这里插入图片描述
结果1:
在这里插入图片描述
使用2:

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

结果2:
在这里插入图片描述

参数:

参数path:因为函数名不带p,没有继承环境变量,因此要传确切的文件路径(相对路径或绝对路径总之能让当前文件找到即可)
参数argv:注意这里的参数类型是char* const而不是const char*,这是个指针指向不可变的指针数组,相比于可变参数列表传递,这个函数是直接将一个参数数组传了过去。也就是把可变参数列表放到了这个数组里。对于自己写的程序要传的path路径是生成的可执行程序的路径,而不是源文件的路径
在这里插入图片描述
在这里插入图片描述

execle()函数

putenv()函数用于添加一个环境变量给调用进程的上下文
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看到当我们不传环境变量时,子进程也可以拿到我们在当前进程创建的环境变量。那么当前进程的父进程可以拿到我们在当前进程的环境变量吗?
在这里插入图片描述
可以看到在当前进程导入的变量与它的父进程无关,它只会传递给子进程

那么我要是就想自己传环境变量应该怎么传呢?
那就要使用exec系列中带e的函数了
使用:
在这里插入图片描述
在这里插入图片描述
结果
在这里插入图片描述
参数
在这里插入图片描述
参数path:表明子进程要替换成的可执行程序的路径
参数arg:可变参数列表,传递命令行参数
参数envp:传递环境变量表,可以用自己写的环境变量的指针数组传递,也可以用全局变量environ传递
传递全局变量environ
使用:
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
对这两种方式进行总结:传递environ会把在父进程中继承中的环境变量也都传过去,若传递的是在当前进程写的自定义环境变量指针数组,那么在替换函数中接收到的环境变量会把在父进程中继承中的环境变量覆盖掉

替换函数总结

1、函数名中带l,就是要我们以参数列表的形式传递命令行参数
2、函数名中带v,就是要我们以指针数组的形式把参数传过去
3、函数中带p,说明它会继承父进程的环境变量,因此可只需指明要去替换的可执行程序的文件名即可,函数会自己去找到该文件
4、函数名中带e的,需要我们自己自定义设置环境变量,可以自己添加环境变量指针数组传过去,但这会覆盖继承的环境变量,如果想保留继承的环境变量,那么在当前进程putenv()对应的环境变量添加到当前进程的上下文(不会添加到父进程),再用全局变量environ传递过去即可

对字母所指的单词进行解释:
l:list列表
v:vector数组
p:path路径
e:environment环境

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

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

相关文章

工程中Http的请求、各种回调函数的使用

文章目录 1、登录回调以及各种函数的使用1、SdoLoginClient工程中的SdoBase_Initialize3接口2、LoginClient中的Initialize接口3、ProcessResponse调用ProcessLoginResponse传递参数给回调函数使用4、ProcessLoginResponse登录响应接口的使用5、ProcessResponse调用然后根据req…

JavaSE 优先级队列(堆)

目录 1 二叉树的顺序存储1.1 存储方式1.2 下标关系 2 堆(heap)2.1 概念2.2 操作-向下调整2.3 操作-建堆 3 堆的应用-优先级队列3.1 概念3.2 内部原理3.3 操作-入队列(向上调整)3.4 操作-出队列(优先级最高)3.5 返回队首元素(优先级最高)3.6 java 中的优先级队列3.7 …

【记录】使用yolov5_obb训练自己的数据集

引言 对于寻常的yolov5目标检测任务,只能检测水平或者垂直的检测框,而对于旋转框的检测却无能为力。为此,在这记录下使用yolov5_obb来训练自己数据集。 一、准备数据集 1、我们先看所需要的数据集文件什么样子,如下图文件夹Sym…

ngx_http_request_s

/* 罗剑锋老师的注释参考: https://github.com/chronolaw/annotated_nginx/blob/master/nginx/src/http/ngx_http_request.h */struct ngx_http_request_s {uint32_t signature; /* "HTTP" */ngx_connection_t …

解决深度学习训练时使用tensorboard http://localhost:6006/无法访问此网站问题

在windows上跑yolov5模型使用了Tensorboard来查看训练过程,开始训练,终端就会提示 直接点击这个网址,就会出现 解决办法是重新开一个终端,激活目前正在使用的虚拟环境,在下面输入 tensorboard --logdir runs\train -…

Leetcode2086. 从房屋收集雨水需要的最少水桶数

Every day a Leetcode 题目来源:2086. 从房屋收集雨水需要的最少水桶数 解法1:贪心 我们可以对字符串 hamsters 从左到右进行一次遍历。 每当我们遍历到一个房屋时,我们可以有如下的选择: 如果房屋的两侧已经有水桶&#xff…

C++ 入门

C关键字 C总计63个关键字,C语言总计32个关键字 命名空间 在c中变量,函数和类都是大量存在的,这些名称都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的就是对标识符的名称进行本地化,以避免命…

电商零售商家需求预测及库存优化问题(第1问)

电商零售商家需求预测及库存优化问题 数据和题目来源于 2023 年 MathorCup 高校数学建模挑战赛——大数据竞赛 只有第一问,使用ARIMA做预测,使用聚类算法做特征相似性 1 数据读取和处理 1.1 清除重复值 注意附件4要去重,原来是56条数据&am…

一文搞懂“支付·清结算·账务”全局

《上帝视角看支付,总架构解析》 对支付的宏观层面做了分析,详解了整个支付体系每一层的架构和业务模型,而每一层的企业内部支付体系建设是什么样的?会涉及到哪些环节和系统?每个系统会涉及到哪些单据和逻辑&#xff0c…

如何使用 Docker 搭建 Jenkins 环境?从安装到精通

不少兄弟搭 jenkins 环境有问题,有的同学用 window, 有的同学用 mac, 有的同学用 linux。 还有的同学公司用 window, 家里用 mac,搭个环境头发掉了一地。。。 这回我们用 docker 去搭建 jenkins 环境,不管你是用的是什么系统&…

KaiwuDB 亮相第四届跨国公司领导人青岛峰会

10月10日至12日,由商务部和山东省人民政府共同主办的第四届跨国公司领导人青岛峰会在青岛国际会议中心举办。该峰会为跨国公司打造的国家级开放平台,是聚集跨国公司与中国合作、专注跨国公司议题、分享跨国公司经验、链接资源、促进合作的重大活动。Kaiw…

4.多层感知机-2简化版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 多层感知机一、感知机1、感知机2、训练感知机3、图形解释4、收敛定理5、XOR问题6、总结 二、多层感知机1、XOR2、单隐藏层3、单隐藏层-单分类4、为什么需要非线性激活函数5、Sigmoid函数6、Tanh函数7、ReLU函数8、多类分…

Spring cloud教程Gateway服务网关

Spring cloud教程|Gateway服务网关 写在前面的话: 本笔记在参考网上视频以及博客的基础上,只做个人学习笔记,如有侵权,请联系删除,谢谢! Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,…

如何将你的PC电脑数据迁移到Mac电脑?使用“迁移助理”从 PC 传输到 Mac的具体操作教程

有的小伙伴因为某一项工作或者其它原因由Windows电脑换成了Mac电脑,但是数据和文件都在原先的Windows电脑上,不知道怎么传输。接下来小编就为大家介绍使用“迁移助理”将你的通讯录、日历、电子邮件帐户等内容从 Windows PC 传输到 Mac 上的相应位置。 在…

Leetcode刷题详解——下降路径最小和

1. 题目链接:931. 下降路径最小和 2. 题目描述: 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择…

UML—时序图是什么

目录 前言: 什么是时序图: 时序图的组成元素: 1. 角色(Actor) 2. 对象(Object) 3. 生命线(LifeLine) 4. 激活期(Activation) 5. 消息类型(Message) 6.组合片段(Combined fragment) 时序图的绘制规则:​ 绘制时序图的3步: 1.划清边界&#xf…

redis-集群切片

切片集群 我曾遇到过这么一个需求:要用 Redis 保存 5000 万个键值对,每个键值对大约是 512B,为了能快速部署并对外提供服务,我们采用云主机来运行 Redis 实例,那么,该如何选择云主机的内存容量呢&#xff…

linux目录与文件管理

目录与路径 关于执行文件路径的变量:$PATH ls完整文件名为:/bin/ls 在任何文件夹下输入ls命令可以显示出一些信息而不是找不到命令,这就是因为环境变量PATH所致。在执行命令时,系统会依照PATH的设置去每个PATH定义的目录下查找文…

【mysql】实现设置表中所有数据的update_time,要求每1000条设置在一天

实现效果示例 执行SQL:(mysql 版本查看: select VERSION() :5.7.36-log) 实现效果: 这里最后一个id 9 > 总条数 6,所以没有更新到,直接手动补下就行 SELECT * FROM my_test S…

最新ai系统ChatGPT商业运营版网站源码+支持GPT4.0/支持AI绘画+已支持OpenAI GPT全模型+国内AI全模型+绘画池系统

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…