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

这篇具有很好参考价值的文章主要介绍了【Linux】进程周边005之环境变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

👀樊梓慕:个人主页

 🎥个人专栏:《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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器


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

比如:

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

我们来试试:

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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

1.2.2USER

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

1.2.3PWD

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

1.2.4HOME

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

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


2.环境变量的特性

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

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

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


2.1补充知识:命令行参数

main函数有参数么?

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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

2.1.1int argc与char* argv[]

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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

所以我们来推测一下命令行解释器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。

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

那我们再来写一段代码:

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】进程周边005之环境变量,Linux,linux,运维,服务器 也就是说这两个参数就可以让我们通过不同的选项,使同一个程序执行它内部不同的功能。

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

命令行参数也是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;
}

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器 欸,这不是环境变量么!

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器


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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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


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

3.1代码获取环境变量

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

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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器 那我们可以利用他来做点什么呢?

识别用户:

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;
}

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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


3.3本地变量的设置与查看

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

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

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

实例:unset [变量名]


4.环境变量的配置文件

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

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

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

【Linux】进程周边005之环境变量,Linux,linux,运维,服务器

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

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


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

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

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

🌟~ 点赞收藏+关注 ~🌟

=========================================================================文章来源地址https://www.toymoban.com/news/detail-764482.html

到了这里,关于【Linux】进程周边005之环境变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程周边001之进程概念

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.基本概念 2.描述进程-PCB 2.1task_struct-Linux中的PCB 2.2task_struct内容分类(成员) 3.查看进

    2024年02月05日
    浏览(43)
  • 【Linux】进程优先级 && 进程切换 && 环境变量

    目录 一、进程优先级  1、优先级概念  2、优先级特点  3、修改Linux下的优先级 二、进程切换  1、进程特性  2、进程切换 三、环境变量  1、基本概念  2、常见环境变量  3、查看环境变量方法  4、PATH环境变量  5、和环境变量相关的命令  6、环境变量的组织方式  7、通过

    2024年02月11日
    浏览(49)
  • Linux之进程(三)(环境变量)

    目录 一、基本概念 二、环境变量 1、PATH 2、HOME 3、SHELL  三、环境变量参数 四、argc和argv 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:临时文件夹位置和系统文件夹位置等。环境变量通常具有某些特殊用途,还有在系统当中通

    2024年02月04日
    浏览(39)
  • 【Linux】进程周边006之进程地址空间

      👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.程序地址空间 1.1验证地址空间的排布  1.2利用fork函数观察当子进程修改某个共

    2024年02月04日
    浏览(41)
  • 【Linux】探索Linux进程优先级 | 环境变量 |本地变量 | 内建命令

    最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:Linux入门

    2024年02月04日
    浏览(72)
  • 【Linux】进程状态|优先级|进程切换|环境变量

    💕 运行队列: 进程是如何在CPU上运行的:CPU在内核上维护了一个运行队列,进行进程的管理。让进程进入队列,本质就是将该进程的task_struct 结构体对象放入运行队列之中。这个队列在内存中,由操作系统自己维护。 💕 运行状态: 运行状态 进程PCB在运行队列里就是运行

    2024年02月02日
    浏览(43)
  • Linux中的进程、fork、进程状态、环境变量

            进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包

    2024年02月10日
    浏览(44)
  • 【Linux】进程优先级 + 环境变量

    在学完进程状态之后,本章我们将来学习一下环境变量,还有进程优先级等🙋🙋🙋…… 本文实验系统: CentOS 7.6 ~ 优先级是权限吗? 在之前我们讲解过什么是权限:👉 传送门 我们这里讲的优先级并不是权限,那么优先级到底是什么呢? 如果我们说权限是能不能的问题的

    2024年02月05日
    浏览(48)
  • 【Linux】进程周边003之进程优先级

      👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.基本概念 2.PRI与NI 3.利用top命令更改已存在进程的nice值 4.通过renice命令更改进程

    2024年02月03日
    浏览(39)
  • 【Linux】环境变量和进程优先级

    目录 环境变量 什么是环境变量 系统结构 系统接口 深度解析 命令行参数 进程优先级 优先级查看 优先级修改 进程间的概念 🍮平时在使用  Linux  的时候,总会使用  ls  、 pwd  这类的命令,我们也都知道这些命令也是  C  语言写的,但是为什么我们自己写的可执行程序需

    2023年04月27日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包