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

程序替换与shell

程序替换函数execlexeclpexecvexecvpexecvpeexecle一共介绍七个函数这里全都是以exec开头的执行任何程序需要1.找到它 加载它路劲加程序名2.怎么执行例如ls,你想带什么选项呀如 -l -a -d之类由程序和选项决定l-以类似链表的形式告诉我p-不用告诉我路径我自己会到path路径下查找v-vector以数组为参数传递e-envexecl第一个参数是path-你要执行谁(给路径)… -可变参数(你想怎么执行)典型代表printf(上篇文章已经简单介绍过)必须以NULL结尾-告诉选项是结尾了判断递归结束的条件结论命令行怎么写你就怎么填execl(/usr/bin/ls,ls,-a,-l,NULL);//路径程序名选项后面跟着NULLexeclp和execl最重大的区别第一个参数后面参数你想怎么执行一样execlp第一个参数是file只要告诉我程序名execlp会自动到环境变量PATH所标明的路径下查找不了解可以到我之前写的环境变量与虚拟地址空间查看execlp(ls,ls,-a,-l,NULL);//查找目标告诉系统“我要找叫 ls 的程序”,要执行ls指令选项后面跟着NULL虽然省略第二个ls可以省略但不建议省略execv第一个参数和execl一样要路径execv没有可变参数而是变成了指针数组把参数构建成一个数组来传递参数//const char* 是内容不可变而 char* const 是指针本身不可变char*argv[]{ls,-a,-l,NULL};//不带const算是权限缩小是可以的但会提示//注ls,-a,-l在编译器中类型是const char*你这样写编译器会给提示如果想消除这个提示有两种方法//1.将数组类型改为const char*//2.强制类型转化char* argv[] { (char*)ls, (char*)-a, (char*)-l, NULL };虽然编译通过了但如果你后续在代码中真的去修改这些字符串比如 argv[0][0] L;程序会直接崩溃Segmentation Fault因为 ls 实际上还是存储在只读内存区的。char*argv[]{(char*)ls,(char*)-a,(char*)-l,NULL}//写成上述形式execv(/usr/bin/ls,argv);看着这个argv有没有一点眼熟呢没错这样就可以解释通了ls里面有自己的main函数main函数里面的argv接受的就是你的execv里面的argv,再通过遍历你的argv得到argc,之前写的main函数是bash给我们传递进来的bash会构建出这个表用程序替换传递你自己的程序。execvpv-vectorp-pathchar*argv[]{(char*)ls,(char*)-a,(char*)-l,NULL}execvp(argv[0],argv);//argv[0]是ls,ls就是程序名//写习惯一点可以写成execvp(ls,argv);总结l(list)表示参数采用列表v(vector)表示参数用数组p(path)有p自动搜索环境变量pathl和v二选一不会同时存在e(env)表示自己维护环境变量上面的程序替换函数能不能替换我们自己写的自己的程序呢可以的下面举个例子假设当前目录下有这么一个code.c好现在我在这个目录下创建一个myexe.c内容如下好我现在想在code.c下执行这个文件需要先将这个myexe.c先编译成myexe,因为exec函数只识别可执行文件不能识别.源代码文件好前期准备工作已经执行完了现在就可以着手于code.c文件了这里讲一下execl第一个一九是要把路径写出来因为myexe和code.c在同一个目录下用相对路径即可第二个是文件名就是myexe后面不用带选项了直接连接一个NULL表示结束即可我们发现myexe的执行结果出现在了code.c的子进程里面说明替换成功了不止可以替换操作系统里面的函数我自己写的可执行文件也是可以替换的。当然这里用的c编译好的程序替换用java编译好的也可以程序替换自己替换自己也可以不过不推荐容易死循环java语言因为没学这里就不展示了三个月之内把这段空缺的java语言的程序替换补上以及会讲解一下java语言的语法及其知识点vs2022这个IDE可以看成我写好了代码.c文件MSVC 编译器编译链接最后VS2022 调试器 可以让你调试所以现在就可以理解vscode配置环境到底是什么了就是三个部分1.下载“写代码的地方” —— VSCode文本编辑器作用它就像一个高级记事本负责让你舒服地写字写代码提供高亮、自动补全等功能。2.下载“编译器” —— 编译器工具链类似gcc gMSVC3.配置环境变量与插件光下载了还不行你得做两件事让它们连起来配置环境变量告诉系统编译器在哪安装插件告诉 VSCode 怎么调用编译器所以刚开始入门的话都不会建议新生自己去vscode配置环境而是去集成开发环境IDE去练习写代码。execvpeintexecvpe(constchar*file,char*constargv[],char*constenvp[]);//p表示会到环境变量里面找文件不用传递路径v表示以数组的形式传递e是envp,传入全新的环境变量路径的两种选择在 execvpe(const char *file, char *const argv[], char *const envp[]) 中第一个参数 file 有两种用法绝对路径或相对路径如果你传入的是类似 /bin/ls 或 ./my_program 这样的路径系统会直接执行该路径下的可执行文件。它不会去搜索 PATH 环境变量。例子execvpe(“/usr/bin/gcc”, argv, envp);仅文件名需要配合 PATH如果你传入的只是文件名例如 ls那么 execvp 或 execvpe 会根据你当前环境中的 PATH 环境变量去各个目录下一一查找找到后执行。这里的path,是第三个参数中的path,不是父进程的path下面是之前写的代码是命令行参数写过的代码#incluediostreamintmain(int argc,char*argv[],char*env[]){int i0;for(;iargc;i){printf(argv[%d]-%s\n,i,argv[i]);}int j0;for(;env[j];j){printf(:env[%d]:%s\n,j,env[j]);//env[i]最后一个也是NULL}return0;}假设这个代码是卸载code.c里面的他便便宜之后形成了code可执行文件char*myargv[]{(char*)code,(char*)-a,(char*)-b,NULL};extern char**environ;//是为了告诉编译器“这个变量不是我在当前文件里定义的它存在于系统的标准库libc中请去那里找它。”execvpe(code,myargv,environ);exit(3);子进程的参数是父进程通过程序替换函数传递给子进程的给execvpe这个函数传递全新的环境变量调用程序替换时可以传递enviorn,也可以自定义myenv如果你是使用myenv的话子进程的环境变量将会遵循你给的env而不是和父进程一样如果你在调用 execvpe或 execve时显式地将第三个参数设置为全局变量 environ那么新进程的环境变量在逻辑上就和父进程完全一样。默认环境变量execvpe(“./code”,myargv,myenv);覆盖式的使用全新的环境变量execvpe(“./code”,myargv,environ);使用父进程的环境变量如果是想老的环境变脸和在加上自己定义环境变量如果我想在传递环境变量的时候在原有的环境变量上给子进程添加环境变量呢int putenv(char *string);将这个字符串添加到环境变量中代码样例#includestdlib.h#includeunistd.hintmain(){// 使用 putenv 修改当前进程的环境变量// 注意这里的字符串最好是静态存储区或通过 malloc 分配的putenv(MY_NEW_VARhello_world);// 现在调用 execvp (此时它会继承刚才 putenv 修改后的环境)char*argv[]{./child_program,NULL};execvp(./child_program,argv);return0;}当然这样写父进程也会被修改但没什么问题毕竟exec之后代码就被覆盖了如果实在不想让父进程进行修改可以#includestdio.h#includestdlib.h#includeunistd.h#includesys/wait.hintmain(){pid_t pidfork();if(pid0){// --- 这里是子进程 ---// 我们只在子进程里玩 putenvputenv(MY_VARchild_only);char*argv[]{/usr/bin/env,NULL};// 用 env 命令打印出来看看execvp(env,argv);}else{// --- 这里是父进程 ---wait(NULL);// 等子进程跑完printf(父进程检查 MY_VAR: %s\n,getenv(MY_VAR));// 这里会输出 (null)证明父进程没被污染}父子进程都有命令行参数和环境变量,谁调用就该用谁的环境变量证明如上结论子进程可以直接继承父进程环境变量可以自己定义新的环境变量也可以添加环境变量----------------------------------------------------------------------------------------------------------------execleintexecle(constchar*path,constchar*arg,.../* (char *) NULL, char *const envp[] */);execl,exelp,execle,execv,execvp.execvpe都是库函数execve是系统调用这里的库函数底层都是execve。

相关文章:

程序替换与shell

程序替换函数execlexeclpexecvexecvpexecvpeexecle一共介绍七个函数 这里全都是以exec开头的 执行任何程序, 需要: 1.找到它 加载它(路劲加程序名) 2.怎么执行(例如ls,你想带什么选项呀,如 -l -a -d之类&a…...

DeepSeek-Coder-V2-Lite-Instruct社区成功案例:开发者如何用AI助手实现项目突破

DeepSeek-Coder-V2-Lite-Instruct社区成功案例:开发者如何用AI助手实现项目突破 【免费下载链接】DeepSeek-Coder-V2-Lite-Instruct 开源代码智能利器——DeepSeek-Coder-V2,性能比肩GPT4-Turbo,全面支持338种编程语言,128K超长上…...

Java开发必看:解决国密SM2算法报错‘Unknown named curve‘的完整指南(附Bouncy Castle配置)

Java开发实战:国密SM2算法Unknown named curve报错深度解析与Bouncy Castle最佳配置指南 金融级Java应用开发中,国密算法SM2的集成就像在钢筋森林里铺设光纤——看似简单却暗藏技术陷阱。当控制台突然抛出Unknown named curve: 1.2.156.10197.1.301这个看…...

新手入门:借助快马AI实现你的第一个超能力选择网页

作为一个刚接触编程的新手,我最近想尝试做一个有趣的网页项目。看到网上那些酷炫的交互效果,总觉得很神奇但又无从下手。直到发现了InsCode(快马)平台,它让我这个小白也能轻松实现"超能力选择器"这样的创意想法。 项目构思 我想做一…...

vscode如何添加ollama本地模型-实现token自由

vscode一直支持的都是云端闭源的模型,例如 GPT Claude等等,当这些闭源模型的免费额度用完之后,则需要付费继续使用。本文介绍的是vscode接入ollama的本地模型,从而实现token自由。 ollama 首先需要到ollama的官网下载ollama应用…...

Pixel Epic动态卷轴效果展示:从空白屏幕到完整研报的实时生成录屏

Pixel Epic动态卷轴效果展示:从空白屏幕到完整研报的实时生成录屏 1. 引言:当科研遇上像素冒险 在传统的研究报告撰写过程中,我们常常面对冰冷的界面和机械化的交互体验。Pixel Epic彻底改变了这一现状,将严肃的学术研究变成了一…...

千问3.5-9B视觉模型快速部署指南:单卡RTX 4090D实测可用

千问3.5-9B视觉模型快速部署指南:单卡RTX 4090D实测可用 1. 开篇:为什么选择千问3.5-9B视觉模型? 如果你正在寻找一个能够理解图片内容的中文多模态模型,千问3.5-9B视觉版(Qwen3.5-9B-VL)值得你关注。这个…...

AI时代:重塑核心竞争力

一、企业的核心竞争力重塑未来企业的护城河是AI构建的流程,而不是的数据。 过去我们说数据是石油,但在 LLM 时代,通用数据的价值在被快速拉平。而公司内部独特的、经过千锤百炼的工作流程、决策逻辑、操作手册,这些才是无法被轻易…...

StructBERT中文语义匹配实战:一键部署+可视化进度条,小白也能用

StructBERT中文语义匹配实战:一键部署可视化进度条,小白也能用 1. 工具概览:你的中文句子"CT扫描仪" 想象一下,你手上有两份用户反馈:"这个手机电池很耐用"和"这款设备续航能力超强"。…...

免费窗口调整工具:3分钟学会强制修改任意窗口大小

免费窗口调整工具:3分钟学会强制修改任意窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽、尺寸固定的应用程序窗口而烦恼吗?Wi…...

Voron 2.4 3D打印机进阶调试与故障排除指南

Voron 2.4 3D打印机进阶调试与故障排除指南 【免费下载链接】Voron-2 Voron 2 CoreXY 3D Printer design 项目地址: https://gitcode.com/gh_mirrors/vo/Voron-2 机械系统精调:从结构应力到运动精度 问题导向:框架组装后出现对角线偏差超过2mm&a…...

Mermaid Live Editor:代码即画布的思维可视化革命

Mermaid Live Editor:代码即画布的思维可视化革命 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

Hotkey Detective:3步快速解决Windows热键冲突,找出占用快捷键的幕后黑手

Hotkey Detective:3步快速解决Windows热键冲突,找出占用快捷键的幕后黑手 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/h…...

飞书机器人告警配置避坑指南:夜莺监控常见报错解决方案

飞书机器人告警配置避坑指南:夜莺监控常见报错解决方案 深夜的告警风暴里,飞书机器人突然罢工是什么体验?上周三凌晨2点,当我面对满屏的Key Words Not Found和sign match fail报错时,终于理解了为什么运维工程师的咖啡…...

一键启动翻译服务:Hunyuan-MT-7B-WEBUI详细使用教程(附加速链接)

一键启动翻译服务:Hunyuan-MT-7B-WEBUI详细使用教程(附加速链接) 1. 为什么选择Hunyuan-MT-7B-WEBUI 在全球化交流日益频繁的今天,语言障碍成为许多企业和个人面临的现实挑战。传统翻译工具要么准确度不足,要么部署复…...

DFRDisplayKm 实用指南:Apple Touch Bar Windows支持常见问题全解析

DFRDisplayKm 实用指南:Apple Touch Bar Windows支持常见问题全解析 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm DFRDisplayKm 是一款专为 Windows…...

Qwen3-8B镜像站新手教程:如何选择模型并进行首次提问

Qwen3-8B镜像站新手教程:如何选择模型并进行首次提问 1. 认识Qwen3-8B:你的智能AI助手 Qwen3-8B是Qwen系列最新一代大型语言模型,拥有80亿参数,在推理能力、指令执行和多语言支持方面表现出色。这个模型特别适合个人开发者和小型…...

告别Keil5刺眼白屏!保姆级教程教你配置VS Code同款暗黑主题(附3套配色方案)

Keil5暗黑主题终极改造指南:从护眼原理到深度定制 凌晨三点的实验室里,显示屏刺眼的白光让我的眼球开始灼烧般疼痛——这是许多嵌入式开发者共同的噩梦。Keil5作为单片机开发的主流工具,其默认的亮色主题在长时间编码时带来的视觉负担远超你的…...

2269 上市公司智慧供应链对数字创新的平均处理效应指标【ATT】(2000-2024)

数据来源上市公司年报时间跨度2000-2024区域跨度全国所有上市公司数据格式数据格式为Excel形式数据简介本数据集旨在全面测度中国上市公司智慧供应链建设的政策冲击效应,涵盖了2000年至2024年A股上市公司的长周期面板数据。作为研究数字经济与实体经济深度融合的关键…...

如何轻松实现单机游戏分屏多人:Nucleus Co-Op完整指南

如何轻松实现单机游戏分屏多人:Nucleus Co-Op完整指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为找不到联机伙伴而烦恼吗&a…...

5. 大模型核心基础概念(三):模型量化、蒸馏、微调的核心逻辑(通俗解读)

001、开篇:为什么大模型需要“瘦身”与“调教”?——量化、蒸馏、微调的必要性 上周在产线调试一个端侧部署的视觉模型,设备跑着跑着就内存溢出了。同事盯着日志问我:“模型在服务器上明明跑得好好的,怎么一到嵌入式板子上就崩了?” 我看了眼那 2GB 的 RAM 和板载的 8GB …...

嵌入式系统数据校验算法详解与实践

1. 单片机校验算法的重要性在嵌入式系统开发中,数据校验是确保通信可靠性和数据完整性的基础保障。我从事嵌入式开发十多年来,见过太多因为忽略校验而导致系统故障的案例。比如2018年参与的一个工业控制项目,由于CAN总线通信没有采用CRC校验&…...

基于Python的校园便利平台毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Python的校园便利平台,以提升校园生活品质,优化资源配置,增强学生与教职工的互动体验。具体研究目的如…...

ESP32驱动MT6826S磁编码器:从接线防烧到实时速度计算(附完整Arduino库)

ESP32与MT6826S磁编码器实战指南:安全接线与高效数据采集 1. 硬件连接:避开那些可能毁掉你项目的陷阱 MT6826S磁编码器作为一款高精度角度测量器件,在机器人关节控制、无人机云台稳定等场景中表现优异。但许多开发者第一次接触这款编码器时&a…...

利用kimi与快马平台,十分钟搭建个人博客web应用原型

最近想快速验证一个个人博客的创意,但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型,没想到十分钟就搞定了可运行的Web应用,分享下这个高效流程: 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...

HoRain云--Vue3组件开发:从入门到精通的终极指南

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...

NVIDIA Profile Inspector实战指南:从参数调试到显卡性能极致释放

NVIDIA Profile Inspector实战指南:从参数调试到显卡性能极致释放 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 诊断性能瓶颈 显卡性能表现不佳往往是多种因素共同作用的结果&#xff0c…...

如何快速掌握ViGEmBus虚拟手柄驱动:新手5分钟完全指南

如何快速掌握ViGEmBus虚拟手柄驱动:新手5分钟完全指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否遇到过这样的困扰:心爱的…...

CLAP音频分类环境部署:Python3.8+PyTorch+Gradio一键配置指南

CLAP音频分类环境部署:Python3.8PyTorchGradio一键配置指南 想不想让电脑“听懂”声音?比如,上传一段音频,它就能告诉你这是狗叫、猫叫还是汽车鸣笛。这听起来像是科幻电影里的场景,但现在,借助一个叫CLAP…...

在ESP32上为LVGL 8.x添加中文输入法:从拼音到候选词显示的完整实现

在ESP32上为LVGL 8.x实现高性能中文输入法的工程实践 当我们在智能家居控制面板上输入Wi-Fi密码时,或者在工业HMI设备中输入参数时,中文输入往往成为嵌入式设备最令人头疼的用户体验瓶颈。ESP32作为物联网领域的主流芯片,其有限的RAM资源&…...