linux19:程序替换

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

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 pid9 10   if(id==0)  //child process11   {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 process19   pid_t ret = waitpid(id,NULL,0); //child process pid , status , WNOHANG20   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会尝试执行它。

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

五:自定义壳shell

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

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

相关文章

Java项目:基于SSM框架实现的德云社票务管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的德云社票务管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

windows下搭建python+jupyter notebook

一.下载python 下面网址下载python3 https://www.python.org/ 二. 安装jupyter notebook 三. 修改配置 四. 检测是否正常运行

JeeSite V5.7.1 发布,Java快速开发平台,Spring Boot,Vue3,微服务

升级内容 新增 IdGen.randomShortString() 方法&#xff0c;随机生成一个短字符串 新增 PropertiesUtils、Global 一些便捷方法&#xff0c;如果有设定属性值再执行某操作 新增 连接池 queryTimeout 查询超时时间、transactionQueryTimeout 事务超时时间参数 新增 Table 支持…

华为OD机试 - 跳马 - 广度优先搜索BFS(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

windows 7 安装IPP协议,支持Internet打印

1 windows 7 安装IPP协议,支持Internet打印 #控制面板--打开或关闭Windows功能 3 复制Printers 文件夹 到 c:\inetpub\wwwroot\,复制msw3prt.dll到c:\windows\system32\ 4 打开IIs管理器 #报错:模块列表中不存在此处理程序所需的指定模块。如果您添加脚本映射处理程序映射&…

Golang | Leetcode Golang题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; type pair struct{ right, height int } type hp []pairfunc (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i].height > h[j].height } func (h hp) Swap(i, j int) { h[i], h[j]…

npm,yarn清楚缓存

1.运行以下命令来清理npm缓存&#xff1a; npm cache clean --force或者运行以下命令清理Yarn缓存&#xff1a; yarn cache clean2.删除 node_modules 和锁文件&#xff1a; 删除 node_modules 目录和 package-lock.json 或 yarn.lock 文件&#xff0c;然后重新安装依赖 rm …

【Android】自定义换肤框架02之自定义AssetManager和Resource

ResourceId是如何变成对应Resource的 在上一章中&#xff0c;我们已经讲过&#xff0c;apk中有个资源索引文件 其中保存了每个资源对应的id&#xff0c;name&#xff0c;type&#xff0c;path 资源文件的解析&#xff0c;主要涉及两个类&#xff0c;AssetManager和Resource …

独立开发者系列(20)——扫码登录

&#xff08;1&#xff09;网页端的安全登录设计 很多大型网站都有登录限制。这里以一个案例作为例子完整解析。理解安全的登录设计方式&#xff0c;无论对于以后做自动化&#xff0c;自动登录网站&#xff0c;获取数据&#xff0c;还是自己开发月租类型的系统非常有用。当前一…

算法力扣刷题 三十三【347.前 K 个高频元素】

前言 栈和队列篇。 记录 三十三【347.前 K 个高频元素】 一、题目阅读 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1]…

从草图到现实:SketchUp 在建筑项目中的独特优势

Sketchup 是全球最受欢迎的建筑可视化平台之一。借助该平台提供的各种工具&#xff0c;您可以创建可供市场使用的逼真项目。Sketchup为什么如此优秀&#xff1f;它对建筑项目有哪些优势&#xff1f;下面&#xff0c;你将看到什么是 Sketchup 以及这个工具的一些重要的优势。 关…

新手如何尽快入门性能测试?

一、学习基础知识 性能测试的基本概念&#xff1a; 性能测试的定义&#xff1a;使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程。 性能测试的目的&#xff1a;评估当前系统的能力、寻找性能瓶颈以优化性能、评估软件是否能够满…

高阶算法班从入门到精通之路课程

本课程旨在帮助学员深入理解算法与数据结构的核心概念&#xff0c;从而掌握高级算法设计与分析技能。每集课程内容精心设计&#xff0c;涵盖了常用数据结构、经典算法及其应用场景等方面的深度讲解&#xff0c;同时通过大量实例演练&#xff0c;帮助学员提升解决实际编程难题的…

【Dell R730 折腾记录】风扇调速--在 Ubuntu 系统上开机自启动并每隔30分钟执行一次风扇定速脚本

前段时间升级了一下机柜里的服务器&#xff0c;替换掉了一台旧的 Dell 服务器&#xff0c;换上了这台 R730。但是无奈于噪音的袭扰&#xff0c;搁置了一段时间。我在这台机器上目前安装了一块 Intel Xeon E5-2630v3 芯片以及一张改过散热的 NVIDIA Tesla P4 计算卡。结果就是散…

使用工业自动化的功能块实现大语言模型应用

大语言模型无所不能&#xff1f; 以chatGPT为代表的大语言模型横空出世&#xff0c;在世界范围内掀起了一场AI革命。给人的感觉似乎大模型语言无所不能。它不仅能够生成文章&#xff0c;图片和视频&#xff0c;能够翻译文章&#xff0c;分析科学和医疗数据&#xff0c;甚至可以…

20240706 xenomai系统中网口(m2/minipcie I210网卡)的实时驱动更换

lspci 查看网口 查看网口驱动 1 ubuntu 查看网口驱动 在Ubuntu中&#xff0c;您可以使用lshw命令来查看网络接口的驱动信息。如果lshw没有安装&#xff0c;您可以通过执行以下命令来安装它&#xff1a; sudo apt-get update sudo apt-get install lshw 安装完成后&#xff…

golang与以太坊交互

文章目录 golang与以太坊交互什么是go-ethereum与节点交互前的准备使用golang与以太坊区块链交互查询账户的余额使用golang生成以太坊账户使用golang生成以太坊钱包使用golang在账户之间转移eth安装使用solc和abigen生成bin和abi文件生成go文件使用golang在测试网上部署智能合约…

《昇思25天学习打卡营第12天|onereal》

CycleGAN图像风格迁移互换 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将图像从源域…

C++中的引用——引用做函数参数

作用&#xff1a;函数传参时&#xff0c;可以利用引用的技术让形参修饰实参 优点&#xff1a;可以简化指针修改实参 示例&#xff1a; 1.值传递 运行结果&#xff1a; 2.地址传递 运行结果&#xff1a; 3.引用传递 运行结果&#xff1a;

量化交易策略:人性的弱点之反马丁策略

一、马丁策略与反马丁策略的区别 上一文章介绍了马丁策略,是一种赌徒的加仓策略,即在亏损时不断增加仓位,以期在市场反转时获得更大的收益。这种策略的核心理念是“顺势而为”,即在市场上涨时不断加仓,而在市场下跌时保持仓位不变或者减少仓位。 反马丁策略则是一种保守策…