【Linux】进程替换、命令行参数及环境变量(超详解)
目录
进程替换
替换函数的含义
命令行参数
环境变量
PATH
进程替换
我们先看代码:
1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5 printf("process...begin!\n");6 7 execl("/usr/bin/ls","ls","-a","-l",NULL);8 9 printf("process...end!\n");10 return 0;11 }
运行结果:

通过运行结果,我们会发现:
printf("process...end!\n");并没有被执行;
这是为什么?
我们先来看一下exec函数:

还有一个:int execve(const char *path, char *const argv[], char *const envp[]);
exec函数其实就是替换函数,图像表示:

以上述代码为例:execl("/usr/bin/ls","ls","-a","-l",NULL);就是将磁盘中的有一段程序的代码和数据替换掉父进程在内存中的代码和数据;exec*执行完毕后,后续的代码不见了,是因为被exec*替换了,所以不会执行exec*后面的代码,简单来说:被替换后后面代码已经找不到了,自然不会被执行;
这个替换,本质就是这个程序被加载到内存了(exec*函数类似于一种Linux上的加载函数);
那我们非要让后面的代码可以执行,要怎么做呢?
很简单,父进程中exec*函数后的代码无法执行是因为exec*函数的替换,把后续代码给替代了,找不到后续代码;那我们让后续代码可以找到不就可以了?怎么让它可以找到-------->fork创建子进程,在子进程中执行exec*函数,这就是用的我们之前提到的写实拷贝(让子进程自己去替换,父进程的代码和数据不受影响);
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main()5 {6 printf("process...begin!\n");7 8 pid_t id =fork();9 if(id==0)10 {11 execl("/usr/bin/ls","ls","-a","-l",NULL);12 exit(1);13 }14 //父进程15 sleep(5);16 printf("process...end!\n");17 return 0;18 }

这样父进程后续代码就可以被执行了;
原理是什么呢?

一开始,子进程完全的父进程的拷贝(页表指向是红色箭头),后面由于exec*函数替换,因为替换的不仅仅是数据,连代码也替换了,这时OS就是进行写时拷贝,把代码和数据都复制了一份(绿色和蓝色箭头的指向);父进程代码和数据仍然存在;
替换函数的含义
(1)int execl(const char *path, const char *arg, ...);
这个l指的是list 列表,path就是要执行程序的路径,arg:在命令行中怎么执行,这个就怎么写:
例如:ls -a ---->"ls","-a",即可;最后一个参数必须为NULL;
![]()
(2)int execv(const char *path, char *const argv[]);
这个v指的是vector,path是路径,argv:就是把命令放到argv里面;
例如:

(3)int execlp(const char *file, const char *arg, ...);
用户可以不传要执行文件的路径,但是要传文件名,直接告诉exec*函数,我要执行谁;
这里的p:查找这个程序,系统会在环境变量PATH进行查找;
例如:
![]()
(4)int execle(const char *path, const char *arg, ...,char *const envp[]);
这里的e:environment:环境变量; envp[]:整体替换所有的环境变量;
例如:

当然,除了可以替换系统命令,也可以替换我们自己写的程序:
先写一个程序:test.c,然后执行:


使用:
![]()
即可:
运行结果:

命令行参数
我们发现在main函数中可带参数,也可以不带参数;
带参数:

这个参数有什么用呢?
我们看下面的代码,将argv打印出来:

运行结果:

根据运行结果我们可以理解:命令行参数本质是交给我们程序的不同选型,用来定制不同的程序功能,命令中会携带很多选项;
例如:ls -a;
ls -l;等
环境变量
在Linux中,存在一些全局的设置,表明,告诉命令行解释器应该取哪些路径下去寻找可执行程序;
PATH
PATH:环境变量;
$PATH:打印环境变量内存;

系统中很多的配置,在登录Linux系统的时候,已经加载到bash进程中(内存);
我们发现ls命令:并不需要./,但是我们自己写的程序,比如myprocess,运行时却要./myprocess才可以运行,这是为什么?

我们只需要将我们的程序配置到环境变量中即可;
那怎么配置呢?
/PATH=$PATH:路径;
例如:
PATH=$PATH:home/sxh/111/lesson06;

因为我们配置的这个PATH是在内存中,重启后,PATH就会复原;
当然,除了PATH,还有其他的环境变量,比如:HOME/SHELL/HISISIZE/PWD等;
env:查看所有环境变量
echo $xxx:查看某一个环境变量
export name=value:设置环境变量
unset name:取消环境变量
怎么打印环境变量?

运行结果:

注意:环境变量默认是可以被子进程拿到的;

相关文章:
【Linux】进程替换、命令行参数及环境变量(超详解)
目录 进程替换 替换函数的含义 命令行参数 环境变量 PATH 进程替换 我们先看代码: 1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5 printf("process...begin!\n");6 7 execl("/usr/bin/ls","ls"…...
MySQL事务日志—redo日志介绍
MySQL事务日志—redo日志 事务有4种特性: 原子性、一致性、隔离性和持久性。 那么事务的四种特性到底是基于什么机制实现? 事务的原子性、一致性由事务的 undo 日志事务的隔离性由锁机制和MVCC实现。事务的持久性由redo 日志来保证。 两类日志概述:…...
告别音乐小白!字节跳动AI音乐创作工具,让你一键变作曲家!
还在羡慕别人能创作动听的音乐?五音不全的你,也梦想着谱写属于自己的乐章?现在,机会来了!字节跳动推出了一款AI音乐创作工具——抖音推出的海绵音乐,它能让你轻松一键创作音乐,即使是“音乐小白…...
空心正方形图案
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。 输入描述: 多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“ * ”的数量。 输出描述…...
【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。EXCEL使用表格。
前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。…...
虾皮Shopee大数据面试题及参考答案
Cube 表性能优化,还有其他优化的方法吗? Cube 表性能优化可以从多个方面入手。 一方面,可以优化数据存储格式。选择合适的存储格式能够减少存储空间占用,提高数据读取速度。例如,Parquet 格式是一种高效的列式存储格式,它可以按列进行数据压缩,大大减少磁盘 I/O 和内存占…...
重学SpringBoot3-集成Redis(六)之消息队列
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(六)之消息队列 1. 什么是发布/订阅(Pub/Sub)?2. 场景应用3. Spring Boot 3 整合 R…...
LeetCode 134 Gas Station 解题思路和python代码
题目: There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i]. You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith station to its next (i 1)th station. You …...
服务攻防
171、一次完整的 HTTP 请求过程 域名解析 --> 发起 TCP 的 3 次握手 --> 建立 TCP 连接后发起 http 请求 --> 服务器 响应 http 请求,浏览器得到 html 代码 --> 浏览器解析 html 代码,并请求 html 代码中的资源(如 js、 css…...
leetcode 力扣算法题 快慢指针 双指针 19.删除链表的倒数第n个结点
删除链表的倒数第N个结点 题目要求题目示例解题思路从题目中的已知出发思考寻找目标结点条件转换核心思路 需要注意的点改进建议 完整代码提交结果 题目要求 给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。 题目示例 示例 1࿱…...
网络五层模型:物理层、数据链路层、网络层、传输层、应用层,分别解决了什么问题?
网络五层模型(也称为TCP/IP模型的简化版本)将网络通信过程分为五个层次,每一层都解决了特定的问题。以下是每一层的详细解释及其解决的问题: 1. 物理层(Physical Layer) 解决的问题:数据的物理…...
OpenCV视频I/O(18)视频写入类VideoWriter之初始化 VideoWriter 对象的函数open()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 初始化或重新初始化视频编写器。 该方法打开视频编写器。参数与构造函数 VideoWriter::VideoWriter 中的相同。 cv::VideoWriter::open() 函数用…...
大数据处理从零开始————4.认识HDFS分布式文件系统
1.分布式文件系统HDFS 1.1 认识HDFS 当单台服务器的存储容量和计算性能已经无法处理大文件时,分布式文件系统应运而生。什么是分布式系统,分布式系统是由多个独立的计算机或节点组成的系统,这些计算机通过网络连接ÿ…...
jwt认证课件讲解
JWT 基本概念 在用户登录后,我们需要在不同请求之间记录用户的登录状态,常用方式一般有三种:Cookie,Session和Token。 这里我们使用第三种Token令牌方式来实现认证鉴权,采用Json Web Token认证机制(简称…...
【判断推理】逻辑基础
1.1 命题 用语言、符号或者式子表达的,可以判断真假的陈述句称为命题,一般写为 若p,则q 真命题:判断为真的语句假命题:判断为假的语句 eg1:小张是中国人(若是小张,则是中国人&#…...
AcWing 655:天数转换 ← 整除、求余
【题目来源】https://www.acwing.com/problem/content/657/【题目描述】 读取对应于一个人的年龄(以天为单位)的整数值,并转化为年,月和日表示方式输出,年、月、日分别对应 ano(s), mes(es), dia(s)。 注意:…...
【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
使用git clone 时报错unable to access xxx: SSL certificate problem: 这个报错通常是由于SSL证书问题引起的。通常可以按照以下步骤进行排查: 检查网络连接:确保你的网络连接正常,可以访问互联网。尝试使用其他网站或工具测试网络连接是否正…...
算法笔记(十三)——BFS 解决最短路问题
文章目录 迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树 BFS 解决最短路问题 BFS(广度优先搜索) 是解决最短路径问题的一种常见算法。在这种情况下,我们通常使用BFS来查找从一个起始点到目标点的最短路径。 迷宫中离入口最近的出口 题目:…...
Android 简单实现联系人列表+字母索引联动效果
效果如上图。 Main Ideas 左右两个列表左列表展示人员数据,含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表,点击某个item,展示一个气泡组件(它会自动延时关闭), 左列表滚动并显示与点击的索引列表item …...
自动驾驶-问题笔记-待解决
参考线的平滑方法 参考线平滑算法主要有三种: 离散点平滑;螺旋曲线平滑;多项式平滑; 参考链接:参考线平滑 对于平滑方法,一直不太理解平滑、拟合以及滤波三者的作用与区别; 规划的起点&#x…...
5大维度解析Mac Mouse Fix:从工具到体验的蜕变之旅
5大维度解析Mac Mouse Fix:从工具到体验的蜕变之旅 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款让普通鼠标在macOS系统上…...
Windows 系统下通过 composer 快速搭建 ThinkPHP6 开发环境及实战配置指南
1. 环境准备:Windows下搭建ThinkPHP6的基础条件 在Windows系统下搭建ThinkPHP6开发环境,首先需要确保基础软件栈的完整性。我遇到过不少新手开发者直接跳过了环境检查环节,结果在后续步骤中频繁报错。这里分享几个必须提前准备好的关键组件&a…...
# 发散创新:基于Python与Open3D的数字孪生可视化实时仿真系统构建在工业4.0和智能制造浪潮中,**
发散创新:基于Python与Open3D的数字孪生可视化实时仿真系统构建 在工业4.0和智能制造浪潮中,数字孪生(Digital Twin) 已成为连接物理世界与虚拟模型的核心技术之一。本文将围绕一个轻量级、高扩展性的数字孪生应用原型系统展开讲解…...
Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37%
Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37% 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新,显著提升…...
Simple Comic:Mac平台的开源漫画阅读解决方案
Simple Comic:Mac平台的开源漫画阅读解决方案 【免费下载链接】Simple-Comic OS X comic viewer 项目地址: https://gitcode.com/gh_mirrors/si/Simple-Comic 你是否曾遇到这样的困扰:在Mac上尝试打开漫画文件时,不是格式不兼容就是阅…...
MidScene:让AI成为你的自动化协作者 副标题:无需编程的多平台智能操作解决方案
MidScene:让AI成为你的自动化协作者 副标题:无需编程的多平台智能操作解决方案 【免费下载链接】midscene Let AI be your browser operator. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在数字化时代,重复性操作和…...
Dify新手必看:3种创建应用的方法全解析(附模板使用技巧)
Dify新手必看:3种创建应用的方法全解析(附模板使用技巧) 第一次打开Dify工作室时,面对琳琅满目的功能选项,很多开发者都会感到无从下手。作为一个从零开始接触Dify的过来人,我完全理解这种困惑——毕竟当初…...
我把DeepSeek调教成了我的‘专属文案总监’:角色扮演Prompt的实战配置手册
把DeepSeek调教成你的「专属文案总监」:高阶Prompt工程实战指南 当市场部的Lisa第一次用AI生成产品文案时,她得到的是一篇充满技术术语的说明文;而运营总监Mike让AI写的周报,读起来像学术论文。这就像给米其林大厨一台高级烤箱&a…...
C++多线程编程:为什么compare_exchange_weak比strong更适合循环场景?
C多线程编程:为什么compare_exchange_weak比strong更适合循环场景? 在构建高性能并发系统时,C开发者常常需要在原子操作的精确性和执行效率之间寻找平衡点。compare_exchange系列函数作为无锁编程的核心工具,其强弱两种变体的选择…...
从零到一:OpCore-Simplify如何让黑苹果配置变得如此简单?
从零到一:OpCore-Simplify如何让黑苹果配置变得如此简单? 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCor…...

