实操(环境变量)Linux

环境变量概念

我们用语言写的文件编好后变成了程序,./ 运行的时候他就会变成一个进程被操作系统调度并运行,运行完毕进程相关资源被释放,因为它是一个bash的子进程,所以它退出之后进入僵尸状态,bash回收他的退出结果,我们就能够得到他的退出结果,这是我们之前说的,现在的问题是我写的可执行程序和系统自带的指令有什么区别呢?答案是没有任何区别,只不过人家写的软件被纳入到Linux基本指令的范畴,你写的只能你自己玩,本质上都叫做可执行程序,为什么运行我自己写的程序必须要带 ./ 呢,如果想让我的程序不带 ./ 该怎么解决呢?

这里就可以找到比较好的切入点,. 就是当前路径,/ 是路径分隔符,所以 ./myproc 是我们在用相对路径的方式来定位可执行程序,换句话说,如果你愿意,你也可以从根目录开始,/home/cyx/day12/myproc,用绝对路径的方式访问自己的程序

ls可以不带 ./ 就能运行的原因在于,默认的程序在系统当中,会存在一个环境变量,它能够帮我们通过该变量在系统中特定的路径下帮我们搜索对应的ls命令,执行一条命令的前提,一定是要先找到他,找不到还执行啥呢?系统中存在的环境变量叫做PATH,读取环境变量的内容(echo $PATH)

综合刚刚所说为什么执行pwd、ls这些命令可以不带路径,原因是因为它们在特定的环境变量所指明的若干路径当中,Shell会从PATH环境变量(一串用冒号分隔的目录路径)中从左到右依次搜索这些目录,寻找与命令名称匹配的可执行文件,找到就自动执行了,不用带路径,而我们自己写的可执行程序对应的路径是自己的路径,没有在环境变量里,所以执行时无法直接找到我们的可执行程序,必须要用户指明出他对应的路径

上图可以证明,(which ls)可以看到他在环境变量/usr/bin/路径下,他就不用带 ./ 运行了,换言之,我们想不用带 ./ 就能运行也可以实现,在PATH环境变量所支持的众多:分隔的一个个路径当中,把你的路径追加到后面(export PATH=$PATH:/home/cyx/day12)

  • 注意可能会写出这样的命令(export PATH=/home/cyx/day12), 这种方式是不对的,不是把PATH是整体全部换成自己的路径,这样会把把别人的路径全部覆盖,如果你不小心误操作了环境变量,不用担心,将xshell全部关闭,重新再登录就可以了

还有另一种方式,把可执行程序拷贝到/usr/bin路径下(sudo cp -rf myproc /usr/bin)

  • 在Linux中,把可执行程序,拷贝到系统默认路径下,这种让我们可以直接访问的方式,相当于Linux下软件的安装:你们用windows当中的工具帮你们安装软件,本质是把可执行程序、配置文件,全部拷贝到你系统特定的某些路径下,比如C盘的Profile,这个动作就叫做安装,不想要了可以删掉(sudo rm /usr/bin/myproc -rf)

  • 删掉的动作其实就是某种意义上的卸载

 环境变量相关函数

1. exec 函数族

  • 这些函数用于替换当前进程的映像为新的程序。如果执行成功,原程序的代码、数据、堆栈等会被新程序覆盖,但进程ID不变
#include <unistd.h>extern char **environ;  全局变量,指向当前进程的环境变量数组(格式为 KEY=VALUE)
示例:for (char **env = environ; *env; env++) {printf("%s\n", *env);}int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);
int execlp(const char *file, const char *arg, .../* (char  *) NULL */);
int execle(const char *pathname, const char *arg, .../*, (char *) NULL, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
  • 命名规则

    • 后缀 l:参数通过可变参数列表传递,参数列表以NULL结尾
    • 后缀 v:参数通过数组传递,数组元素以 NULL 结尾
    • 后缀 p:在 PATH 中搜索可执行文件
    • 后缀 e:允许自定义环境变量(通过 envp 参数)
  • 错误处理:所有 exec 函数失败时会返回 -1,需检查 errno
  • 环境变量execle 和 execvpe 可以覆盖默认环境变量,其他函数继承调用进程的环境

2 getenv

  • 功能:获取指定环境变量的值。

#include <stdlib.h>char *getenv(const char *name);参数:name:环境变量名返回值:成功返回变量值(字符串),失败返回 NULL示例:char *path = getenv("PATH");

3 putenv

  • 功能:设置或修改环境变量(格式为 KEY=VALUE
#include <stdlib.h>int putenv(char *string);参数:string:环境变量字符串(如 "PATH=/usr/bin")返回值:成功返回 0,失败返回非 0注意:修改会影响当前进程及其子进程示例:putenv("MY_VAR=123");

实操

makefile

myproc:proc.cgcc -o $@ $^
.PHONY:clean
clean:rm -f myproc

exec/otherproc.cc

#include <iostream>
#include <unistd.h>using namespace std;int main()
{for(int i = 0; i < 5; i++){cout << "-------------------------------------------------------------------------"<< endl;cout << "我是另一个程序,我的pid是: " << getpid() << endl;cout << " MYENV: " << (getenv("MYENV")==NULL?"NULL":getenv("MYENV")) << endl;cout << " PATH: " << (getenv("PATH")==NULL?"NULL":getenv("PATH")) << endl;cout << "-------------------------------------------------------------------------"<< endl;sleep(1);}return 0;
}

proc.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>int main()
{extern char **environ;pid_t id = fork();if(id == 0){//childprintf("我是子进程: %d\n", getpid());//execl: 如果替换成功,不会有返回值,如果替换失败,一定有返回值 ==》如果失败了,必定返回 ==》 只要有返回值,就失败了//不用对该函数进行返回值判断,只要继续向后运行一定是失败的!//execl("/bin/ls", "ls", "-a", "-ln", NULL); //lsssss: 不存在//char *const myargv[] = {//    "ls",//    "-a",//    "-l",//    "-n",//    NULL//};//execv("/bin/ls", myargv); //lsssss: 不存在//execlp("ls", "ls", "-a", "-l", "-n", NULL);//execvp("ls", myargv);//char *const myenv[] = {//    "MYENV=YouCanSeeMe",//    NULL//};putenv("MYENV=YouCanSeeMe");//覆盖式写入,只执行我们定义的环境变量,系统环境变量就失效了,可以传environ全局环境变量数组execle("./exec/otherproc", "otherproc", NULL, environ); exit(1);}sleep(1);//fatherint status = 0;printf("我是父进程: %d\n", getpid());waitpid(id, &status, 0);printf("child exit code: %d\n", WEXITSTATUS(status));return 0;
}

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

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

相关文章

torch.cat和torch.stack的区别

torch.cat 和 torch.stack 是 PyTorch 中用于组合张量的两个常用函数&#xff0c;它们的核心区别在于输入张量的维度和输出张量的维度变化。以下是详细对比&#xff1a; 1. torch.cat (Concatenate) 作用&#xff1a;沿现有维度拼接多个张量&#xff0c;不创建新维度 输入要求…

深入解析@Validated注解:Spring 验证机制的核心工具

一、注解出处与核心定位 1. 注解来源 • 所属框架&#xff1a;Validated 是 Spring Framework 提供的注解&#xff08;org.springframework.validation.annotation 包下&#xff09;。 • 核心定位&#xff1a; 作为 Spring 对 JSR-380&#xff08;Bean Validation 2.0&#…

2025年认证杯数学建模竞赛A题完整分析论文(含模型、可运行代码)(共32页)

2025年认证杯数学建模竞赛A题完整分析论文 目录 摘要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1解析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1求解结果分析&#xff08…

Google A2A协议,是为了战略性占领标准?

一、导读 2025 年 4 月 9 日&#xff0c;Google 正式发布了 Agent2Agent&#xff08;A2A&#xff09;协议。 A2A 协议致力于打破智能体之间的隔阂&#xff0c;让它们能够跨越框架和供应商的限制&#xff0c;以一种标准化、开放的方式进行沟通与协作 截止到现在&#xff0c;代…

Ansible:roles角色

文章目录 Roles角色Ansible Roles目录编排Roles各目录作用创建 roleplaybook调用角色调用角色方法1&#xff1a;调用角色方法2&#xff1a;调用角色方法3&#xff1a; roles 中 tags 使用实战案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于层次性、结构化…

MCU的USB接口作为 USB CDC串口输出

引用&#xff1a; https://microchip-mplab-harmony.github.io/usb_apps_device/apps/usb_uart_bridge_dual/readme.html STM32 USB使用记录&#xff1a;使用CDC类虚拟串口&#xff08;VCP&#xff09;进行通讯_stm32 usb使用记录:使用cdc类虚拟串口(vcp)进行通讯-CSDN博客 前…

深度解析强化学习:原理、算法与实战

深度解析强化学习:原理、算法与实战 0. 前言1. 强化学习基础1.1 基本概念1.2 马尔科夫决策过程1.3 目标函数1.4 智能体学习过程2. 计算状态值3. 计算状态-动作值4. Q 学习4.1 Q 值4.2 使用 Q 学习进行 frozen lake 游戏4.3. frozen lake 问题4.4 实现 Q 学习小结系列链接0. 前…

UE5蓝图之间的通信------接口

一、创建蓝图接口 二、双击创建的蓝图接口&#xff0c;添加函数&#xff0c;并重命名新函数。 三、在一个蓝图&#xff08;如玩家角色蓝图&#xff09;中实现接口&#xff0c;如下图&#xff1a; 步骤一&#xff1a;点击类设置 步骤二&#xff1a;在细节面板已经实现的接口中…

2025 年“认证杯”数学中国数学建模网络挑战赛 A题 小行星轨迹预测

近地小行星&#xff08; Near Earth Asteroids, NEAs &#xff09;是轨道相对接近地球的小行 星&#xff0c;它的正式定义为椭圆轨道的近日距不大于 1.3 天文单位&#xff08; AU &#xff09;的小行星。 其中轨道与地球轨道最近距离小于 0.05A 且直径大于 140 米的小行星被…

Axure中继器(Repeater): 列表多选和 列表查询

文章目录 引言I 列表多选添加选中交互事件添加未选中交互事件II 列表查询知识点操作说明引言 基于鼠标点击交互事件实现列表多选列表查询 I 列表多选 添加选中交互事件 给列标题第一列多选框元件命名为ckeck,并同时添加选中交互事件; 同步添加设置选择/选中动作,目标元件选…

windows11下pytorch(cpu)安装

先装anaconda 见最下方 Pytorch 官网&#xff1a;PyTorch 找到下图&#xff08;不要求版本一样&#xff09;&#xff08;我的电脑是集显&#xff08;有navdia的装gpu&#xff09;&#xff0c;装cpu&#xff09; 查看已有环境列表 创建环境 conda create –n 虚拟环境名字(…

最新版IDEA超详细图文安装教程(适用Mac系统)附安装包及补丁2025最新教程

目录 前言 一、IDEA最新版下载 二、IDEA安装 三、IDEA补丁 前言 IDEA&#xff08;IntelliJ IDEA&#xff09;是专为Java语言设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发&#xff0c;被公认为业界最优秀的Java开发工具之一。DEA全称Int…

react从零开始的基础课1

全文约5万字。 1.hello,.. // App.jsx import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {const [count, setCount] useState(0)return (<><Greeting name"world&qu…

【linux知识】web服务环境搭建(一):用户以及开发环境初始化

toc 创建用户组以及用户 以下是 创建用户组 wendao 和用户 wendao 并指定 GID、UID 及家目录 的完整操作指南&#xff1a; 一、创建用户组&#xff08;指定 GID&#xff09; sudo groupadd -g 1500 wendao # 创建组并指定 GID 为 1500• 注意&#xff1a;GID 需唯一&#…

音视频 五 看书的笔记 MediaCodec

MediaCodec 用于访问底层媒体编解码器框架&#xff0c;编解码组件。通常与MediaExtractor(解封装,例如Mp4文件分解成 video和audio)、MediaSync、MediaMuxer(封装 例如音视频合成Mp4文件)、MediaCrypto、Image(cameraX 回调的ImageReader对象可以获取到Image帧图像,可转换成YU…

李宏毅NLP-3-语音识别part2-LAS

语音识别part2——LAS Listen Listen主要功能是提取内容信息&#xff0c;去除说话人差异和噪声 。编码器&#xff08;Encoder&#xff09;结构&#xff0c;输入是声学特征&#xff0c;经过 Encoder 处理后&#xff0c;输出为高级表示&#xff0c;这些高级表示可用于后续语音识别…

开源CMS的模块化设计和API接口如何具体影响其扩展性?

优秀的CMS系统都有自己主打的特点&#xff0c;开源CMS凭借其灵活性和低成本优势占据了市场主流地位&#xff0c;而模块化设计与API接口正是其扩展性的两大基石。本文将深入探讨这两大技术特性是如何影响cms的扩展性的。 一、模块化设计&#xff1a;功能解耦与生态繁荣的引擎 …

一文读懂WPF系列之常用控件以及样式

WPF控件 控件分类概览常用控件常用控件代码示例和效果 样式与模板应用样式定义​​方式行内样式​​页面/窗口级资源样式&#xff08;Local Resource&#xff09;应用程序全局资源独立资源字典&#xff08;ResourceDictionary&#xff09;控件模板&#xff08;ControlTemplate&…

AndroidTV D贝桌面-v3.2.5-[支持文件传输]

AndroidTV D贝桌面 链接&#xff1a;https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D贝桌面-v3.2.5[支持文件传输] 第一次使用的话&#xff0c;壁纸默认去掉的&#xff0c;不需要按遥控器上键&#xff0c;自己更换壁纸即可

XDocument和XmlDocument的区别及用法

因为这几天用到了不熟悉的xml统计数据&#xff0c;啃了网上的资料解决了问题&#xff0c;故总结下xml知识。 1.什么是XML?2.XDocument和XmlDocument的区别3.XDocument示例1示例2&#xff1a;示例3&#xff1a; 4.XmlDocument5.LINQ to XML6.XML序列化(Serialize)与反序列化(De…