当前位置: 首页 > article >正文

进程替换库函数

1.程序替换预备工作上级目录…下的fork目录下的makefile文件拷贝到当前目录并且命名为Makefile把proc1替换为myexec1.1 现象和原理先看现象可以看到执行了main函数第一句代码接着就执行的是ls -a -l这时候回想fork的两种用法创建子进程一种是指向父进程的部分任务另一种是执行全新的任务就是调用exec系列函数实现的程序替换可以理解为是main函数在exec之后的代码都被替换为了另一个进程的代码堆、栈、数据也被替换掉其实我们知道进程是内核数据结构PCB页表进程地址空间代码/数据而要替换数据/代码其实也就是改页表的虚拟地址和物理地址的映射关系程序替换的本质把数据和代码加载拷贝到内存中也就是IO程序要运行得先加载到内存中只有OS软硬件资源的管理者有权把数据从一个硬件转移到另一个硬件也就是说OS必须提供相应的系统调用完成加载的过程C/C程序第一个执行的函数不是main函数任何程序启动时先执行OS的加载器的代码扫描程序在什么路径找到程序后调用exec替换数据和代码在linux系统下任何程序之前都会先执行加载器(ld)也可以看到exec系列的函数之后的代码不会被执行因为代码已经被替换了执行的是新的代码exec系列的函数成功运行时没有返回值接着我们演示一下forkexec子进程执行exec系列的代码父进程执行自己的代码我们知道子进程创建的时候会拷贝父进程的页表/进程地址空间在指向exec时写入堆/栈/数据/代码发生写时拷贝父子进程分离创建一个进程让该进程可以执行完全不同的程序最经典的引用场景是bash命令行解释器bash最核心的指令是forkexec把输入的命令也就是从命令行输的字符串喂给execbash以子进程的方式运行所以要执行的命令1.2 用法运行任何进程第一件事是把对应的可执行文件从磁盘加载到内存中提供文件路径及名称第二件事就是如何运行比如ls的-a-l选项等exec系列的库函数如下1.2.1 execltop -d 1 -n 4表示每隔1s刷新一次一共刷新4次用于周期性监控进程创建子进程替换为top指令exec系列函数后面的代码都被替换了如果替换成功系统指令或者自己写的程序一般运行结束都会主动退出如果替换失败执行后续指令一般exit填入的值表示出现异常从man手册可以看到正常运行结束exec系列函数是没有返回值的如果出现异常返回值是-1并且设置errno测试如下传入错的path1.2.2 execlpexeclp和execl的区别是我们看到下图一共参数是path一个参数是file只要带p就是我们不需要传可执行文件所在的路径只需要传文件名即可系统会自动去环境变量PATH表明的路径下查找1.2.3 execv我们看到execv和execl的区别是在传第二个及以后参数时execl是列举execv的v是vector把参数存到一个向量表指针数组构建一个参数表接着传入该向量char* const pconst修饰的是p也就是指针本身指针本身不能被修改不能执行其它元素但可以修改*p也就是p指向的内容const char* pconst修饰的是*p也就是p指向的内容不能被修改但是p本身可以修改也就是p可以改指向指向其它元素char* const argv[]是数组指针每个元素是char* const argv[i]const修饰的是指针指针本身不能修改argv[0]“ls”指向内容也不能修改常量字符串也就是数组本身不能被修改但其实/usr/bin/ls本身是可执行程序有main函数main函数有参数int main(int argc, char* const argv[])其实execv(const char* path, char* const argv[])这个argv就是传给ls内的main函数的argv[0]就是程序名argv后面的就是选项那我们在bash命令行输入指令ls -a -l等argv是bash帮我们传的也是用exec系列的替换函数如果是execv将ls -a -l等构建一个参数表传入execv但此处是硬编码的我们知道bash命令行是可以执行很多命令的我们可以把表放到全局每次创建子进程根据情况修改参数表传入execv1.2.4 execvpexecvp和execv的区别是多了一个p也就是第一个参数只需要传入可执行文件名而不需要传入可执行文件所在文件路径测试但打印结果不带颜色其实执行/usr/bin路径下的ls也不带颜色我们bash命令行使用的ls其实是封装过的在传参的时候带上颜色配置即可可以看到.c文件编译得到的myexec可执行文件中创建子进程可以替换为.cpp编译得到的可执行文件也可以调用系统指令linux下都是elf(xecutable and Linkable Format)shell脚本也可以给test.sh➕️可执行权限直接运行脚本语言没有编译链接的概念解释器是由C/C编写在命令行启动解释器变成进程把脚本中的命令一行一行读取进行执行运行python文件python, shell, php, c/c运行时都是进程运行时是进程的都可以进行exec程序替换是系统概念不是语言概念运行一个程序把编译器替换为自己的编译器把代码读进来就能直接编译代码编译器也是命令也有选项gcc/g -o -c -E vs IDE环境写好代码点击fork创建子进程exec系列函数替换为编译器读取并编译代码所有平台比如windows下都有类似的函数安装软件给一个图形化界面软件可以配很多程序图形化界面底层和shell外壳类似点击一个功能forkexec调用该功能vs2022图形化界面的程序配置文本编辑器调试器编译器三个命令打开代码替换编辑器编译代码替换编译器想使用什么功能forkexec1.2.5 execvpe看到下面可以通过路径运行cmd.out但是子进程的环境变量只有该路径子进程要调用exit返回都找不到exit在哪里所以替换失败根本原因不是路径不对也不是理论不对而是依赖把进程的环境变量只改成了当前路径一旦调用任何系统中的函数就出错下面就是调用make调不了cmd.out文件用到动态库终端等环境变量找不到自然出错所以我们在使用exce系列函数带e的是全新定义环境变量覆盖原有的环境变量需要保留父进程环境变量的基础上叠加我们需要的环境变量而在传入路径的时候可以正常运行因为此时直接按路径找不依赖我们设置的envp直接忽略我们设置的envp但有意思的是argv和envp还是传给了cmd的main函数作为参数所以打印的环境变量还是只有当前路径ctrlr可以实现搜索在调用excevpe的时候使用系统环境变量environ无法执行因为cmd.out不在系统环境变量下追加cmd.out所在路径到系统环境变量就可以运行成功如下所示那么我们在使用bash的时候命令行的参数包括argv甚至env都是bash创建子进程替换为要执行的可执行文件并把命令行参数和环境变量传递给可执行程序子进程的系统环境变量也是继承于父进程共用页表地址空间写入时发生写时拷贝在bash改的PATH会作为环境变量参数传递给子进程子进程执行exec替换为myexec接着myexec创建子进程替换执行cmd环境变量参数传给cmd在环境变量追加cmd的路径运行结果只保留追加后的PATH环境变量为空也能运行怪了cmd.out也不在当前目录下如果execl函数不传环境变量用的是继承于父进程的环境变量l 指传递参数的时候进行罗列v 指将参数作为vector进行传递e 指是否自定义环境变量牛刀小试通过fork和exec系统调用可以产生新进程,下列有关fork和exec系统调用说法正确的是? [多选]A.fork生成的进程是当前进程的一个相同副本B.fork系统调用与clone系统调用的工作原理基本相同C.exec生成的进程是当前进程的一个相同副本D.exec系统调用与clone系统调用的工作原理基本相同ABclone是Linux底层创建进程/线程fork基于clone实现下面哪些属于Fork后子进程保留了父进程的什么[多选]A.环境变量B.父进程的文件锁pending alarms和pending signalsC.当前工作目录D.进程号ACB.信号相关信息各进程独立以下代码最终的打印结果是什么intmain(){inta0;a;execl(/usr/bin/pwd,pwd,NULL);printf(%d\n,a);exit(1);}A.0B.1C.2D.以上都不对D以下描述正确的有A.execl函数可以直接指定可执行程序文件的名称而不需要路径B.execle函数可以直接指定可执行程序文件的名称而不需要路径C.execl函数和execle函数的区别是是否自定义设置环境变量D.execl函数和execlp函数的区别是是否自定义设置环境变量C以下描述正确的有[多选]A.程序替换成功后运行完新程序依然会运行原有的代码B.程序替换成功后运行完新程序则程序直接退出C.程序替换成功后原进程退出创建新的进程运行新程序D.程序替换成功后原进程没有退出使用原进程运行新程序BD

相关文章:

进程替换库函数

1.程序替换 预备工作 上级目录(…)下的fork目录下的makefile文件拷贝到当前目录并且命名为Makefile把proc1替换为myexec1.1 现象和原理 先看现象,可以看到执行了main函数第一句代码,接着就执行的是ls -a -l这时候回想fork的两种用…...

以知识驱动 AIAD 行业进化

AIAD 智库 — AI-Augmented Design 行业百科与实践指南 重塑设计的底层逻辑 从 CAD 到 AI-Native 四大内容支柱 支柱描述条目数📖 概念与百科定义行业标准术语,建立专业基石与"定义权"12 深度条目🔬 技术前沿与深度解析展示底层技…...

Coze低代码模式和Vibe Coding的区别

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl Coze的版本 Coze(扣子)是字节跳动推出的一站式AI智能体开发平台,历经两年发展,已从单纯的智能体搭建工具演进为完整的AI应用开发生态。 Coze国内版与海外版最核心的区别在于,它们是两套完…...

通过 curl 命令直接调用 Taotoken 聚合接口进行快速测试与排错

通过 curl 命令直接调用 Taotoken 聚合接口进行快速测试与排错 1. 准备工作 在开始调用 Taotoken 聊天补全接口前,需要准备好以下两项信息:有效的 API Key 和模型 ID。API Key 可在 Taotoken 控制台的「API 密钥」页面生成,模型 ID 则需前往…...

SIMA 2:多模态大模型在3D虚拟环境中的交互革命

1. 项目概述:当通用AI遇上虚拟世界去年第一次接触SIMA项目时,我就被这个将大语言模型与3D环境交互结合的思路惊艳到了。如今看到升级版的SIMA 2基于Gemini架构卷土重来,不禁让人好奇:当最先进的多模态大模型遇上复杂的虚拟环境&am…...

NVIDIA Profile Inspector:解锁显卡驱动隐藏配置的终极调校工具

NVIDIA Profile Inspector:解锁显卡驱动隐藏配置的终极调校工具 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector 是一款功能强大的开源工具,专为 NVIDI…...

TV2TV:文本与视频双向控制的AI生成技术解析

1. 项目概述:当电视节目开始"自我创作"去年我在参与一档综艺节目的后期制作时,导演突然提出一个疯狂的想法:"能不能让AI根据嘉宾聊天的文字记录,自动生成对应的节目画面?"这个看似天马行空的需求&…...

IntelliChat开源智能聊天机器人后端:架构解析与RAG实战部署指南

1. 项目概述:一个能“思考”的聊天机器人后端最近在折腾一个叫 IntelliChat 的项目,这名字听起来就挺有意思——“智能节点”下的“智能聊天”。说白了,这就是一个开源的、可以自己部署的聊天机器人后端引擎。它不像你手机里那些傻乎乎的、只…...

BotW-Save-Manager:快速实现Switch与WiiU存档互转的终极解决方案

BotW-Save-Manager:快速实现Switch与WiiU存档互转的终极解决方案 【免费下载链接】BotW-Save-Manager BOTW Save Manager for Switch and Wii U 项目地址: https://gitcode.com/gh_mirrors/bo/BotW-Save-Manager BotW-Save-Manager是一款专为《塞尔达传说&am…...

ToolFlow:基于工作流引擎的LLM工具编排框架设计与实战

1. 项目概述:当代码生成器开始“思考”工作流最近在GitHub上看到一个挺有意思的项目,叫ToolFlow。初看标题,你可能会觉得这又是一个平平无奇的工具库,但点进去细看,它的定位其实相当独特:一个专为大型语言模…...

provision-core:现代基础设施供应的核心编排引擎设计与实践

1. 项目概述:一个面向现代基础设施的“核心引擎”如果你和我一样,在云原生和基础设施即代码(IaC)的浪潮里摸爬滚打了好几年,那你肯定经历过这样的场景:面对一个全新的项目,你需要快速拉起一套包…...

量子储层计算在金融预测中的创新应用

1. 量子储层计算基础解析量子储层计算(Quantum Reservoir Computing, QRC)是近年来量子机器学习领域最具突破性的技术之一。与传统的神经网络不同,QRC利用量子系统的自然动力学特性作为"计算资源",特别适合处理具有时间…...

Clerk与JavaScript SDK:现代Web应用身份管理的黄金组合

1. 项目概述:为什么是 Clerk 与 JavaScript 的黄金组合? 如果你正在构建一个需要用户系统的现代 Web 应用,无论是 SaaS 产品、社区论坛还是内部工具,那么“用户认证与授权”这个坎儿你肯定绕不过去。传统的做法是什么&#xff1f…...

Web3开发实战:基于luzhenqian/web3-examples的DApp构建指南

1. 项目概述与核心价值最近在捣鼓一些去中心化应用(DApp)的原型,发现很多教程要么太理论化,要么就是代码片段零散,想找个能直接跑起来、覆盖主流场景的完整例子集,还真得费一番功夫。直到我遇到了luzhenqia…...

基于llmapp/openai镜像部署本地AI服务:从原理到实战

1. 项目概述:从开源镜像到本地AI应用部署的桥梁最近在折腾本地大语言模型应用部署的朋友,估计没少跟各种Docker镜像打交道。其中,llmapp/openai这个镜像名在社区里出现的频率相当高。乍一看,它似乎只是一个简单的、封装了OpenAI A…...

BIGME B251彩色电子墨水屏一体机技术解析与应用

1. BIGME B251:首款全功能彩色电子墨水屏一体机深度解析作为一名长期关注显示技术的硬件爱好者,当我第一次看到BIGME B251的众筹信息时,立刻被这个"异类"产品吸引了。在OLED和Mini LED大行其道的今天,一台25.3英寸的彩色…...

智能环境编排系统ScaleEnv:基于强化学习的自动化环境构建

1. 项目背景与核心价值去年在开发一个自动化测试平台时,我深刻体会到环境配置的复杂性——每次新增测试用例都需要手动搭建对应的运行时环境,这个过程消耗了团队近30%的开发时间。正是这个痛点催生了ScaleEnv的构想:我们需要一个能够自主适应…...

构建个人代码知识库:Residuum系统设计与Python实现

1. 项目概述与核心价值最近在整理个人项目时,发现一个挺有意思的现象:很多开发者,包括我自己,都习惯性地把一些零散的、临时的代码片段随手扔在某个文件夹里,或者用记事本、在线工具草草记下。时间一长,这些…...

ReViSE框架:AI视频编辑的自反思学习技术解析

1. 项目背景与核心价值视频编辑领域正面临一个关键挑战:传统工具依赖人工反复试错调整参数,而AI辅助方案又往往缺乏对编辑意图的深度理解。ReViSE框架的提出,本质上是在解决"如何让机器像专业剪辑师一样思考"的问题。这个自反思学习…...

ROCKET模型压缩技术:校准引导的动态剪枝与量化

1. 模型压缩技术背景与挑战在深度学习模型部署的实践中,我们常常面临一个核心矛盾:模型精度与推理效率之间的权衡。大型神经网络虽然在各类任务中表现出色,但其庞大的参数量和高计算复杂度使得在资源受限设备上的部署变得异常困难。这就催生了…...

Lemonade:开源本地AI服务器,打造私有化AI工作站

1. 项目概述:Lemonade,一个真正属于你电脑的本地AI服务器如果你和我一样,对把个人数据上传到云端总有点不放心,但又眼馋那些大模型API的强大功能,那么Lemonade的出现,可能就是你这段时间最值得关注的技术项…...

DouyinLiveRecorder:跨平台直播录制解决方案的3步入门指南

DouyinLiveRecorder:跨平台直播录制解决方案的3步入门指南 【免费下载链接】DouyinLiveRecorder 可循环值守和多人录制的直播录制软件,支持抖音、TikTok、Youtube、快手、虎牙、斗鱼、B站、小红书、pandatv、sooplive、flextv、popkontv、twitcasting、w…...

Go语言OpenAI客户端库kousen/openai深度解析与实战指南

1. 项目概述与核心价值最近在折腾AI应用开发,发现很多朋友在对接OpenAI的API时,总绕不开一个核心问题:如何选择一个稳定、高效且功能齐全的客户端库。市面上选择不少,但要么封装得过于厚重,失去了灵活性;要…...

自蒸馏策略优化(SDPO)原理与实践

1. 项目概述在强化学习领域,策略优化一直是核心挑战之一。传统方法往往面临样本效率低、训练不稳定等问题。自蒸馏策略优化(Self-Distillation Policy Optimization, SDPO)技术通过让智能体"自我学习"的方式,显著提升了策略优化的效率和稳定性…...

Armv9 SME2指令集:向量条件生成与性能优化

1. SME2指令集概述SME2(Scalable Matrix Extension 2)是Armv9架构中引入的重要扩展指令集,专注于提升矩阵和向量运算性能。作为SME(Scalable Matrix Extension)的进化版本,SME2引入了多项创新特性&#xff…...

开源安全修复自动化工具OpenClaw:策略即代码与DevSecOps实践

1. 项目概述:一个开源的安全修复自动化工具最近在整理安全运维的自动化工具链时,发现了一个挺有意思的项目:samerfarida/openclaw-remediation。从名字就能猜个大概,“OpenClaw”直译是“开放的爪子”,听起来就很有“抓…...

AI编程时代Node.js后端安全:VibeCure如何防范API滥用与天价账单

1. 项目概述:当AI助手成为你的“安全漏洞” 最近在给一个Node.js后端项目做安全审计,发现了一个挺有意思的现象:团队里的小伙伴们现在写代码,尤其是集成第三方付费API(比如Twilio发短信、OpenAI调用、SendGrid发邮件&…...

Mock API技能库:从数据模拟到智能拦截的工程实践

1. 项目概述:一个为开发者量身定制的Mock API技能库在前后端分离、微服务架构成为主流的今天,开发过程中的一个经典痛点就是“等待”。前端开发者在界面逻辑完成后,需要等待后端接口的提供才能进行联调;后端开发者在设计好接口契约…...

TV2TV视频生成模型部署与优化实践

1. 项目背景与核心价值TV2TV是近期开源社区备受关注的新型视频生成模型,其核心创新点在于实现了高质量的视频到视频(video-to-video)转换能力。与传统的单帧图像生成不同,TV2TV能够保持视频序列的时间连贯性,在风格迁移…...

Shell脚本工具集:打造高效命令行工作流与自动化实践

1. 项目概述:一个为开发者打造的“瑞士军刀”脚本库如果你和我一样,经常在命令行里折腾,那你肯定遇到过这样的场景:想快速处理一个文本文件,得临时写个Python脚本;想批量重命名一堆文件,得去网上…...