linux19:程序替换

news2024/9/23 15:25:02

一:最简单的看看程序替换是什么样的(单个进程版)

1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6   printf("Before : I am a process , myPid:%d,myPPid:%d\n",getpid(),getppid());
  7 
  8   execl("/usr/bin/top","top",NULL);                                                                                                                  
  9 
 10   printf("After  : I am a process , myPid:%d,myPPid:%d\n",getpid(),getppid());
 11 
 12   return 0;
 13 }

程序在调用execl之后不能打印"After"信息,因为一旦execl被调用,当前的进程映像将被替换,因此第二个print中的代码将不会被执行。

二:进程替换的原理

用fork创建子进程后执行的是和父进程相同的程序,子进程往往要调用一种exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动
例程开始执行。

调用exec并不创建新进程,所以调用exec前后该进程的id并未改变

三:验证各种程序替换的接口(多进程版)

创建一个子进程,并使用execl函数来替换子进程的映像,执行/usr/bin/ls -l -a命令。

1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<sys/types.h>
  5 #include<sys/wait.h>
  6 int main()
  7 {
  8   pid_t id =fork(); //child process return 0 , parent process return child pid
  9 
 10   if(id==0)  //child process
 11   {
 12     printf("Before : I am a process , myPid:%d,myPPid:%d\n",getpid(),getppid());
 13     execl("/usr/bin/ls","-l","-a",NULL);                                                                                                             
 14     printf("After  : I am a process , myPid:%d,myPPid:%d\n",getpid(),getppid());
 15     exit(0);
 16   }
 17 
 18   //parent process
 19   pid_t ret = waitpid(id,NULL,0); //child process pid , status , WNOHANG
 20   if(ret>0)
 21   {
 22     printf("wait sucess,father pid:%d,wait child pid:%d\n",getpid(),ret);
 23   }
 24   return 0;
 25 }
~

execl会替换当前子进程的映像,包括程序的代码和数据

当改子进程程序替换之后,该子进程对应的PCB、进程地址空间以及页表等数据结构都没有发
生改变,对应的execl退出,会继续被父进程等待收回

四:总结

替换函数:

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

exec参数的上传就如命令行一般,命令行怎么打,参数就怎么加,第一个参数为程序的路径,最后一个参数有再补个NULL即可

函数解释:


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

// 尝试执行ls命令
        if (execl("/usr/bin/ls", "ls", "-l", "-a", NULL) == -1) {
            // 如果execl失败,打印错误信息并退出
            perror("execl failed");
            exit(EXIT_FAILURE); // 使用非零值退出,表示程序因错误而终止
        }
        
        // 如果execl成功,if里面的代码不会被执行

命名理解:

这些函数原型看起来很容易混,但只要掌握了规律就很好记。

execl的list链表与execv的vector数组的代码示例:

execl与execlp是否带路径代码示例:

execl函数需要你提供程序的完整路径作为第一个参数

execlp函数使用程序名来搜索程序的路径,不需要提供完整路径。它使用环境变量PATH($PATH)来查找程序,如果PATH环境变量包含的目录中有与程序名匹配的可执行文件,execlp会尝试执行它。

环境变量env:

execle 是需要环境变量的,但即使我们参数中不提供环境变量,execle也能正常运行

环境变量即使没有给子进程也能被子进程拿到,那环境变量是什么时候给进程的呢?

所以即使不通过传参方式,进程也能在程序地址空间内找到环境变量。当程序被替换时,环境变量的信息不会被替换

1:新增环境变量

A:直接在bash中新增环境变量

在bash中新增的环境变量一路被子进程继承,做到添加环境变量

B:父进程地址空间内使用putenv函数

在Linux操作系统中,putenv 是一个用于设置环境变量的函数。可以在程序运行时修改或添加环境变量

putenv 函数会修改程序的全局环境,这个环境变量的设置会继承到该程序启动的任何子进程。

int putenv(char *string);

标准代码示例:

#include <stdlib.h>

int main() {
    char *env_var = "MY_VAR=123";
    if (putenv(env_var) == -1)
    {
        // 处理错误
    }
    // 继续你的程序逻辑...
    return 0;
}

在父进程中使用putenv添加环境变量,出现在子进程的环境变量中:

2:彻底替换环境变量

当我们使用了自己的环境变量参数时,原先的环境变量会被完全替换掉

exec调用举例总结:

exec也可以调用自己写的程序:

五:自定义壳shell

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

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

相关文章

为什么要做智慧水务信息化平台建设?带来的好处

随着科技的飞速发展&#xff0c;我们的生活正在经历一场前所未有的变革。在这场变革中&#xff0c;智慧水务信息化建设如同一股清流&#xff0c;以其独特的魅力&#xff0c;悄然改变着我们对水务管理的传统认知。 为何要进行智慧水务信息化建设&#xff1f;答案显而易见——为…

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

2024HW必修高危漏洞集合_v4.0

高危风险漏洞一直是企业网络安全防护的薄弱点&#xff0c;也成为HW攻防演练期间红队的重要突破口;每年 HW期间爆发了大量的高危风险漏洞成为红队突破网络边界防护的一把利器,很多企业因为这些高危漏洞而导致整个防御体系被突破、甚至靶标失守而遗憾出局。 HW 攻防演练在即&…

SpringCloud学习Day7:Seata

概念 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务 工作流程 TC以Seata服务器形式独立部署&#xff0c;TM和RM则是以Seata Client的形式集成在微服务中运行

SAP 无权限的解决

在进行SAP操作过程中&#xff0c;经常会出现无权限的情况&#xff0c;如客户说没有“ABAAL计划外折旧”权限 但是在查看SU01的时候&#xff0c;已经有角色分配了 解决&#xff1a;1、ABAA之后&#xff0c;SU53查看2、 2、PFCG查找到角色手动添加权限对象S_TCODDE,之后更新&…

SprongBoot及其基础应用全套部署脚本和配置

POM.xml配置 </dependencies> <!--skywalking日志监控依赖--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

小试牛刀-Python生成solana Wallet公私钥

目录 1.编写目的 2.使用依赖 3.实现方法 3.1 Pynacl实现 3.2 ed25519实现 1.编写目的 在使用Python开发solana应用过程中,需要生成solana Wallet公私钥,以实现后续应用操作.这里将Python生成方法进行整理,方便日后的查阅,也能帮助到实现相关功能的朋友。 2.使用依赖 主要…

在 Vue 项目中使用 FullCalendar

1、先安装依赖包&#xff0c;根据自己的需求安装&#xff0c;建议使用cnpm安装&#xff0c;不然会很慢有时候会出现安装不上的情况。 npm i fullcalendar/vue --save npm i fullcalendar/core --save // 在月视图或日视图中操作事件 npm i fullcalendar/daygrid --save // 在…

[数仓]三、离线数仓(Hive数仓系统)

第1章 数仓分层 1.1 为什么要分层 DIM&#xff1a;dimensionality 维度 1.2 数据集市与数据仓库概念 1.3 数仓命名规范 1.3.1 表命名 ODS层命名为ods_表名DIM层命名为dim_表名DWD层命名为dwd_表名DWS层命名为dws_表名 DWT层命名为dwt_表名ADS层命名为ads_表名临时表命名为…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…

python安装PyTorch+cuda

1,最终结果 import torchprint(torch.cuda.is_available()) #显示True&#xff0c;则安装成功 print(torch.__version__)#打印当前PyTorch版本号。 print(torch.version.cuda)#打印当前CUDA版本号。 print(torch.backends.cudnn.version())# 打印当前cuDNN版本号。 print(torc…

PHP红包拓客微信小程序系统源码

&#x1f389;红包狂欢&#xff0c;客源滚滚来&#xff01;红包拓客微信小程序&#xff0c;营销新利器&#x1f680; &#x1f9e7;一、创意红包&#xff0c;吸引眼球 你还在为如何吸引顾客而烦恼吗&#xff1f;红包拓客微信小程序来帮你&#xff01;&#x1f381; 它以创意红…

网上怎么样可以挣钱,分享几种可以让你在家赚钱的兼职项目

当今社会&#xff0c;压力越来越大&#xff0c;工作、家庭、生活等等&#xff0c;方方面面都需要钱&#xff0c;仅靠一份工作赚钱&#xff0c;已经很难满足我们的需求。所以很多人都会尝试做一些副业&#xff0c;兼职来补贴家用。 现在呢&#xff0c;有很多人都想在网上赚钱&am…

基于Spring Boot的先进时尚室内管理系统

1 项目介绍 1.1 研究背景 随着21世纪信息技术革命的到来&#xff0c;互联网的普及与发展对人类社会的演变产生了深远影响&#xff0c;跨越了物质生活的丰盈边界&#xff0c;更深层次地滋养了人类的精神文化生活。在过去&#xff0c;囿于地理位置和技术条件的限制&#xff0c;…

Mybatis-Plus一文详解BaseMapper和Service 使用

Mybatis-Plus简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性&#xff1a; 无侵入&#xff1a;只做增强不做…

OpenAI年初安全事件引发内部分裂

&#x1f989; AI新闻 &#x1f680; OpenAI年初安全事件引发内部分裂 摘要&#xff1a;《纽约时报》报道&#xff0c;OpenAI于2023年初发生安全事件&#xff0c;黑客入侵公司内部邮件系统&#xff0c;窃取敏感讨论信息&#xff0c;但未涉及客户数据和源代码。因未向执法部门…

黑马点评报错@user_script:17: user_script:17: attempt to compare nil with number

后面发现是需要预先写入缓存seckill:stock:11&#xff0c;其中11是优惠券id 我数据库里面是11 &#xff0c;这里redis里面也写了11之后就好使了

AI自动生成PPT怎么用?看完这篇文章你就知道啦

小暑&#xff0c;作为夏季的第五个节气&#xff0c;标志着炎炎夏日的正式到来。在这个时节&#xff0c;阳光明媚&#xff0c;万物生长&#xff0c;人们的心情也随着气温的升高而变得热烈。 然而&#xff0c;对于许多职场人士来说&#xff0c;小暑的到来也意味着需要准备各种汇报…

桑基气泡图 – 5个维度展示KEGG通路富集结果

2022年发表在《Nature communication》上的文章Kir2.1-mediated membrane potential promotes nutrient acquisition and inflammation through regulation of nutrient transporters fig1i使用微生信平台绘制了一张图&#xff0c;我们将其命名为“桑基气泡图”。从此&#xff…

Spring事务的进阶。@Transactional的rollbackFor和propagation属性。

1.3 事务进阶 前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性&#xff1a; 异常回滚的属性&#xff1a;rollbackFor &…