【Linux】环境变量

devtools/2024/9/24 19:59:53/

一、引入环境变量

1.1 引入环境变量

       main函数是有参数的,该参数就用来接收命令行参数的。当我们在执行文件的过程中,我们可以输入一些选项。

1.1.1 参数说明

  • argc(argument count):表示命令行参数的数量,包括程序名。
  • argv(argument vector):是一个字符串数组,其中存储了所有命令行参数。argv[0] 是程序的名称,后续的 argv[1]argv[2] 等是用户输入的参数。

       当我们输入一些选项时, 这些选项是一个命令行字符串。当bash接收到这个字符串后,bash会将这个字符串进行切割,放入到一个命令行参数表中。该表就是main中的argv,我们可以通过遍历还证明这种情况。

1.1.2 为什么要有这个参数

       我们可以通过不同的选项,让我们的同一个程序执行他内部的不同功能。我们在Linux系统中使用ls指令时,就会有多个选项可以使用。

因此,命令行参数就是Linux指令选项的基础。

1.2 环境变量的概念

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 比如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所链接的动态库和静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性y
  • 环境变量不是一个,而是一堆,彼此之间没有任何关系,一般都是系统内置的具有特殊用途的变量

       定义变量的本质就是开辟空间,在运行期间,我们的程序也可以开辟空间,操作系统/bash是用C语言写的程序,也可以在运行中开辟空间,在系统的环境变量,本质就是系统自己开辟空间,给他名字和内容即可。

二、常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
  • SHELL:当前Shell,他的值通常是/bin/bash

三、查看环境变量的方法

3.1 引入

       我们一般在Linux操作系统中运行可执行文件时,我们需要在可执行文件前加入该文件所在的路径,但是我们在执行一些系统指令时,我们不用在其前面加上路径呢?因为在环境变量,系统中的指令的路径都在环境变量中保存着。

       如果我们也想将自己写的可执行文件直接就能执行,也需要将该文件的路径加入到环境变量中。那么如何才能加入该环境变量中呢?

3.2 与环境变量相关的命令

3.3 环境变量的组织方式

       每一个程序都收到一个环境表,环境表就是一个字符指针数组,每一个指针指向一个以“\0”结尾的环境字符串。

四、如何获取或设置环境变量

4.1 命令行第三个参数

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

4.2 通过第三方变量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;
}

4.3 通过系统调用

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}

4.1 getenv函数介绍

  getenv 函数用于获取环境变量的值。它的原型在 <stdlib.h> 头文件中定义,返回指定环境变量的字符串值。

语法

char *getenv(const char *name);

参数

返回值

4.2 putenv函数介绍

   putenv 函数用于设置或更改环境变量。它的原型在 <stdlib.h> 头文件中定义。

语法

int putenv(char *string);

参数

  • string:格式为 "VAR=value" 的字符串,其中 VAR 是环境变量的名称,value 是要设置的值。

返回值

  • 成功时返回 0
  • 失败时返回 -1,并设置 errno

五、环境变量的特点

       环境变量具有全局属性,环境变量会被所有的子进程包括孙子进程进行继承。我们可以使用fork函数创建出父子进程,可以分别打印出父子进程的环境变量


http://www.ppmy.cn/devtools/116644.html

相关文章

c++ pair

C中的pair是一个模板类&#xff0c;用来存储两个不同类型的对象。它位于<utility>头文件中&#xff0c;并定义在std命名空间中。 pair的定义如下&#xff1a; template <class T1, class T2> struct pair {using first_type T1;using second_type T2;T1 first;…

单片机学到什么程度才可以去工作?

说实话&#xff0c;10几年前&#xff0c;我自学单片机转行的时候&#xff0c;也是一头雾水&#xff0c;也是一边苦苦挣扎&#xff0c;一边迷茫的状态。 硬件、软件、编程...样样都需要学&#xff0c;连从哪儿开始都不知道&#xff0c;每次看到那些密密麻麻的电路图和代码&#…

c语言中“函数指针”

变量有地址&#xff0c;数组有地址&#xff0c;那么函数是否有地址呢&#xff1f; 有 int Add(int x,int y){ return xy; } int main() { pritnf("%p\n",&Add); pritnf("%p\n",Add); //&函数名和函数名都是函数的地址&#xff0c;没…

解决 Ubuntu 18.04 下与 TIFFField 和 Anaconda 冲突导致的库加载问题

在 Ubuntu 18.04 系统上&#xff0c;我在安装完ROS后&#xff0c;启动具有 GUI 的软件&#xff08;如 RViz 和 Gazebo&#xff09;时遇到了一个问题&#xff1a;每次尝试启动这些软件时&#xff0c;终端中都会报错&#xff0c;错误信息类似如下&#xff1a; rviz: relocation …

【资源三号卫星】

资源三号卫星 资源三号卫星&#xff08;ZY-3&#xff09;&#xff0c;作为中国第一颗民用高分辨率光学传输型测绘卫星&#xff0c;于2012年1月9日成功发射&#xff0c;正式拉开了我国在高分辨率对地观测领域自主发展的序幕。以下是对资源三号卫星的详细介绍&#xff1a; 基本…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

订单超时取消的11种方式

在电商、支付等系统中&#xff0c;一般都是先创建订单&#xff08;支付单&#xff09;&#xff0c;再给用户一定的时间进行支付&#xff0c;如果没有按时支付的话&#xff0c;就需要把之前的订单&#xff08;支付单&#xff09;取消掉。 这种类似的场景有很多&#xff0c;还有…

深入解析Linux驱动开发中的I2C时序及I2C高频面试题

目录 1 I2C通信协议及关键时序事件 1.1 I2C总线结构 1.2 关键时序事件 1.3 仲裁机制与总线冲突解决 2 Linux内核中的I2C时序处理 2.1 I2C适配器 2.2 I2C算法 2.3 I2C核心组件 3 I2C时序问题的调试与解决方法 3.1 超时机制与唯一地址 4 I2C总线挂死问题分析及解决方法…