【Linux】进程周边005之环境变量

 

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.环境变量是什么?

1.1查看环境变量的方法

1.2常见的环境变量

1.2.1PATH

1.2.2USER

1.2.3PWD

1.2.4HOME

2.环境变量的特性

2.1补充知识:命令行参数

2.1.1int argc与char* argv[]

2.1.2char* env[]

2.2环境变量如何具有全局属性?

3.环境变量的代码获取和设置

3.1代码获取环境变量

3.1.1通过main函数的第三个参数获取环境变量(不常用)

3.1.2通过getenv()函数获取环境变量(常用)

3.1.3通过第三方变量environ获取环境变量(不常用)

3.2设置环境变量

3.3本地变量的设置与查看

3.4unset取消环境变量或本地变量

4.环境变量的配置文件


前言

本篇文章博主将会与大家共同学习环境变量,那么环境变量究竟在扮演着什么样的角色呢?

为什么我们在编写C/C++代码时,不需要显式的告诉编译器我们所需要链接的动态静态库在哪,但链接照样可以成功并生成可执行程序,其实这里就是有环境变量的辅助。


 欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。 

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.环境变量是什么?

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。

下面带你认识几种环境变量来辅助你理解环境变量。

1.1查看环境变量的方法

实例:echo $NAME    //NAME:你的环境变量名称

实例:env    //显示所有环境变量 

1.2常见的环境变量

1.2.1PATH

如何执行一个可执行程序?


可是为什么系统自带的命令(本质就是可执行程序)不需要带文件路径呢?

比如:

 其实就是环境变量PATH的配置,我们查看一些PATH的内容:

我们发现pwd的路径就在PATH中,也就是说,可执行程序的路径如果在环境变量PATH中,那么就可以不需要带文件路径的执行了。

我们来试试:

你当然可以将你的可执行程序放到环境变量中的路径下,但是我并不推荐你这样做,因为你会污染你的系统目录,从而引发一些不必要的麻烦。

所以你可以这样做:修改环境变量。

注意:如果你不慎覆盖了PATH,可以直接关闭XSHELL,因为你覆盖的PATH是加载到内存中的,重启XSHELL会重新读取磁盘中的文件,重新初始化PATH。 

1.2.2USER

当我们执行whoami时,系统是如何知道当前用户是谁的,是因为有USER这个环境变量。

1.2.3PWD

当我们执行pwd时,系统是如何知道当前路径的,是因为有PWD这个环境变量。

1.2.4HOME

当我们访问家目录时,系统是如何知道家目录在哪的,是因为有HOME这个环境变量。

好了,举这些例子都是为了解释说明环境变量的概念。

定义变量的本质其实是开辟空间,所以系统的环境变量本质就是系统或bash开辟的一块内存空间,存放着名称和数据。


2.环境变量的特性

环境变量通常具有全局属性,可是为什么呢?

其实是因为环境变量会被子进程继承下去,所以环境变量才具有全局属性。

那么我们就来探究下这个继承的过程,但在开始前我们需要一点补充知识。


2.1补充知识:命令行参数

main函数有参数么?

之前学习C/C++时,我从未见过main函数有参数。

但实际上main函数拥有三个参数:

2.1.1int argc与char* argv[]

  • 第一个参数argc:表示argv数组中存放的字符指针个数
  • 第二个参数argv:存储的是相关的字符指针,指针指向的是一个个的字符串

那我们来打印一下试试,这两个形参是什么内容:

 我们发现打印出来的好像是我们输入的命令啊。

所以我们来推测一下命令行解释器bash会干什么:

  1. printf("[ff@hecs-235417 test_23_12_09]$ ");
  2. char buffer[1024];
  3. scanf("%s",buffer);//fgets()
  4. 然后将输入进来的字符串传递给main函数的char* argv[],字符串数组的元素个数传递给int argc。

那我们再来写一段代码:

int main(int argc, char* argv[], char* env[])
{
    if (argc != 4)
    {
        printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n", argv[0]);
        return 1;
    }

    int x = atoi(argv[2]);
    int y = atoi(argv[3]);

    if (strcmp("-add", argv[1]) == 0)
    {
        printf("%d+%d=%d\n", x, y, x + y);
    }
    else if (strcmp("-sub", argv[1]) == 0)
    {
        printf("%d-%d=%d\n", x, y, x - y);
    }
    else if (strcmp("-mul", argv[1]) == 0)
    {
        printf("%d*%d=%d\n", x, y, x * y);
    }
    else
    {
        printf("unknown!\n");
    }
    return 0;
}

 也就是说这两个参数就可以让我们通过不同的选项,使同一个程序执行它内部不同的功能。

这是不是就是我们平时使用的指令后面跟上不同的选项,执行内部不同的功能!?

命令行参数也是Linux指令选项的基础。 


2.1.2char* env[]

同样的我们来打印看看该参数传递了什么?

int main(int argc, char* argv[], char* env[])
{
    printf("I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
    for (int i = 0; env[i]; i++)
    {
        printf("env[%d] -> %s\n", i, env[i]);
    }
    return 0;
}

 欸,这不是环境变量么!

也就是说main函数的第三个参数传递的是环境变量!


2.2环境变量如何具有全局属性?

上面介绍main函数的第三个参数char* env[]时,我们发现他传递的是环境变量,也就是说环境变量具有全局属性的方法就是通过子进程继承父进程的环境变量,而其传递所用的方式就是该参数。

比如:bash在创建子进程时会维护两张表,一张表为命令行参数字符串数组,另一张表为环境变量字符串数组,bash作为父进程会将这两张表传递给子进程,子进程通过main函数的第三个参数进行接收。


3.环境变量的代码获取和设置

3.1代码获取环境变量

3.1.1通过main函数的第三个参数获取环境变量(不常用)

首先第一种通过代码获取环境变量的方式就是利用main函数的第三个参数,前面已经讲过了,这里就不多赘述了。

3.1.2通过getenv()函数获取环境变量(常用)

int main()
{
    const char* username = getenv("USER");
    printf("username: %s\n", username);
    return 0;
}

 那我们可以利用他来做点什么呢?

识别用户:

int main()
{
    const char* username = getenv("USER");
    if (strcmp(username, "ff") == 0 || strcmp(username, "fanzimu") == 0)
    {
        printf("this is my process core function\n");
    }
    else
    {
        printf("你没有权限\n");
    }
    return 0;
}

3.1.3通过第三方变量environ获取环境变量(不常用)

首先我们通过man指令来查看下environ

environ是指向环境变量字符串数组的二级指针。

所以我们可以通过该二级指针获取环境变量。

代码如下:

#include <stdio.h>
int main(int argc, char* argv[])
{
	extern char** environ;
	int i = 0;
	for (; environ[i]; i++) {
		printf("%s\n", environ[i]);
	}
	return 0;
}

3.2设置环境变量

实例:export AGE=22

相当于给bash导出的环境变量,当执行myprocess后,bash是myprocess的父进程,所以myprocess继承了父进程的环境变量,所以该环境变量也就具有了全局属性。


3.3本地变量的设置与查看

注意:本地变量无法再env表中查到,且本地变量不会被子进程继承,不全局,只在bash中有效。

set命令:显示本地定义的变量和环境变量。

3.4unset取消环境变量或本地变量

实例:unset [变量名]


4.环境变量的配置文件

我们之前说环境变量是内存中的数据,我们每次在bash上修改环境变量,下次重登录的时候,所有环境变量会初始化,之前修改的内容就会被重新覆盖成最开始的内容,那很明显,这是因为环境变量是从磁盘中的某个文件中读取而来的。

环境变量的配置文件:.bash_profile

该配置文件在每个用户的家目录下。

如果我们对其内容进行修改:

下次重登录时,我们发现修改的环境变量被读取了:

讲完环境变量,你是否可以理解为什么我们每次登录默认所在的路径就是你自己的家目录呢?

那是因为每次登陆最开始系统需要读取你自己的环境变量配置文件! 


 =========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工具化法则

《卓越成效的程序员》是若干程序员系列书籍我比较喜欢的一本&#xff0c;类似的还有《卓越程序员密码》等。《卓越成效的程序员》高明之处是不仅仅给出原则&#xff0c;还大谈工具和代码&#xff0c;这如同诸多鸡汤文在”布道”的层面之下实战干货&#xff0c;深得广大从业人员…

使用openMVS库,在VS2022中启用c++17标准编译仍然报错

使用openMVS库&#xff0c;在VS2022中启用c17标准编译仍然报错 现象 项目中引用了某些开源库&#xff08;例如openmvs2.1.0&#xff09;&#xff0c;编译时要求启用编译器对c17的支持。 没问题&#xff01;大家都知道在下图所示的位置调整C语言标准&#xff1a; 但是&#…

【Transformer】Transformer and BERT(1)

文章目录 TransformerBERT 太…完整了&#xff01;同济大佬唐宇迪博士终于把【Transformer】入门到精通全套课程分享出来了&#xff0c;最新前沿方向 学习笔记 Transformer 无法并行&#xff0c;层数比较少 词向量生成之后&#xff0c;不会变&#xff0c;没有结合语境信息的情…

动态加载库

no_mangle 不要改标识符 首先是认识这个标注&#xff1a;mangle&#xff0c;英文的含义“撕裂、碾压”。我第一次把这个单次误以为是manage&#xff0c;说实话两个单词还挺像的。 RUS中函数或静态变量使用#[no_mangle]这个标注属性后&#xff0c;编译器就不会修改它们的名字了…

机器学习 | KNN算法

一、KNN算法核心思想和原理 1.1、怎么想出来的&#xff1f; 近朱者赤&#xff0c;近墨者黑&#xff01; 距离决定一切、民主集中制 1.2、基本原理 —— 分类 k个最近的邻居 民主集中制投票分类表决与加权分类表决 1.3、基本原理 —— 回归 计算未知点的值决策规则不同均值法与…

windows10-EMQX与MQTTX的安装及配置使用教程

windows10-EMQX安装及配置使用教程 一、下载安装1.1 下载1.2 安装1.3 设置开机自启动 二、连接MQTT2.1 MQTT下载安装2.1.1 下载2.1.2 安装及配置 三、EMQX常用命令 本文介绍的是在windows10系统下的emqx的安装、配置及使用教程。 一、下载安装 1.1 下载 下载链接&#xff1a…

设计模式之创建型设计模式(一):单例模式 原型模式

单例模式 Singleton 1、什么是单例模式 在软件设计中&#xff0c;单例模式是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 这意味着无论何时需要该类的实例&#xff0c;都可以获得相同的实例&#xff0c;而不会创建…

1.新入手的32位单片机资源和资料总览

前言&#xff1a; 学了将近1年的linux驱动和uboot&#xff0c;感觉反馈不足&#xff0c;主要是一直在学各种框架&#xff0c;而且也遇到了门槛&#xff0c;比如驱动部分&#xff0c;还不能随心所欲地编程&#xff0c;原因是有些外设的原理还不够深刻、有些复杂的底层驱动的代码…

Vue3知识点总结

目录 一.创建Vue2工程 1.使用 vue-cli 创建 2.使用 vite 创建 二.常用 Composition API setup ref函数 reactive函数 计算属性与监视 1.computed函数 2.watch函数 3.watchEffect函数 一.创建Vue2工程 1.使用 vue-cli 创建 查看vue/cli版本&#xff0c;确保vue/cli版本…

【2023海光杯】“智能储物柜系统”电控部分

简单说明 在代码实现部分会给出设计理念和分析&#xff0c;整体资源可以直接下载压缩包&#xff08;手机端依然看不到&#xff0c;还是不知道为什么&#xff09;。 使用设备 按照题目要求需要制作16个储物格&#xff0c;对应16扇门。16扇门的开关可以用矩阵键盘来控制。 在不考…

C# 基本桌面编程(二)

一、前言 本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接 C# 基本桌面编程&#xff08;一&#xff09;https://blog.csdn.net/qq_71897293/article/details/135024535?spm1001.2014.3001.5502 二、控件布局 1 叠放顺序 在WPF当中布局&#xff0c;通…

【咕咕送书 | 第7期】深入探索Spring Batch:大规模批处理的领航者

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

bp神经网络对csv文件或者xlsx文件进行数据预测

1.input(1:m,:)‘含义 矩阵A第一列的转置矩阵。(x,y)表示二维矩阵第x行第y列位置的元素&#xff0c;x为:则表示所有的行。因此&#xff0c;A(:,1)就表示A的第1列的所有元素&#xff0c;这是一个列向量。 所以这里input(1:m,:)表示1到m行&#xff0c;所有列&#xff0c;而后面…

Win32程序与MFC程序构建顺序梳理

Windows程序的生成顺序 Windows窗口的生命周期 初始化操作 从WinMain函数开始&#xff0c;注册窗口&#xff1b;创建窗口&#xff1b; 调用CreateWindow,为程序建立了一个窗口&#xff0c;作为程序的屏幕 舞台。CreateWindow产生窗口之后会送出WM_CREATE消息给窗口函数&…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI&#xff0c;是一种由人制造出来的机器&#xff0c;该机器可以模仿人的思想和行为&#xff0c;从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括&#xff1a;芯片、大数据、算法系统、网络等多项基础…

企业呼叫中心系统怎么样?

随着现代商业环境的变化&#xff0c;呼叫中心系统成为众多企业日常运营的重要组成部分。企业呼叫中心系统是一种集中管理和处理企业电话通信的解决方案&#xff0c;它可以改善客户服务质量&#xff0c;提升服务效率&#xff0c;并为企业带来诸多优势。 企业呼叫中心系统功能概…

2021年数维杯国际大学生数学建模D题2021年电影市场票房波动模型分析求解全过程文档及程序

2021年数维杯国际大学生数学建模 D题 2021年电影市场票房波动模型分析 原题再现&#xff1a; 1、电影票房预测建模背景   随着人们文化消费需求的增加&#xff0c;电影院和银幕的数量不断增加&#xff0c;我国的电影产业不断呈现出繁荣景象。2019年&#xff0c;全国电影票房…

2024年【金属非金属矿山(地下矿山)安全管理人员】及金属非金属矿山(地下矿山)安全管理人员实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员是安全生产模拟考试一点通总题库中生成的一套金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员实操考试视频&#xff0c;安全生产模拟考试一…

libxls - 编译

文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译 概述 想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…