0
点赞
收藏
分享

微信扫一扫

Linux 进程环境变量详解

罗蓁蓁 2022-03-15 阅读 64

目录

环境变量

1.概念

2.常见的环境变量

2.1PATH

2.2HOME

2.3SHELL

3.查看当前环境变量

3.1使用env命令来查看​

3.2使用echo查看环境变量内容

3.3环境变量的组织方式

4 环境变量对应的文件

         4.1.系统级文件

         4. 2用户级文件

5.修改环境变量 

           5.1命令范式

           5.2修改方式命令行当中直接修改​​​

           5.3文件中修改

           5.4扩展

6.代码获取环境变量

          6.1通过main函数的参数获取

          6.2argc:命令行中参数个数

          6.3argv:命令行中参数具体内容

          6.4 environ(使用environ 获取环境变量)

          6.5 getenv

       7.进程虚拟地址空间

        ①单个进程打印全局变量的地址

        ②创建子进程,父子进程都打印全局变量的地址

        ③子进程修改全局变量的值,父子进程分别打印全局变量的地址和值

       8.虚拟地址

       9.三个经典问题



环境变量

1.概念

e.g: 链接的时候,帮助链接器找到动态库(标准库)(注:用户自己编写的动态库,需要自己指定环境变量)

2.常见的环境变量

2.1PATH

PATH的路径:每个分号就是一个路径:

每执行一个指令,首先就会从PATH里面从上到下查找,如果找到就立刻执行。

2.2HOME

2.3SHELL

3.查看当前环境变量

3.1使用env命令来查看

3.2使用echo查看环境变量内容

3.3环境变量的组织方式

4 环境变量对应的文件

4.1.系统级文件

4. 2用户级文件

 

5.修改环境变量 

5.1命令范式

export 环境变量名称 = $环境变量名称 :新添加的环境变量内容

5.2修改方式
命令行当中直接修改

解决方案:可以直接重新开一个窗口。

5.3文件中修改

 不会立刻生效,需要source配合使用。

 

  

5.4扩展


如何让自己的程序。不加 ./ 直接使用程序 名称执行??
两种方式:
①将我们的程序放在/user/bin下面(不推荐,因为这个里面放的都是系统生成的)。
②设置环境变量
在PATH环境变量当中增加可执行程序的路径。(三种方式途径)

  • 如果①②都设置了,那么他就会从PATH从上往下找,如何在某个可执行程序下找到就执行。不会再往后执行了。

6.环境变量的组织方式

通过字符指针数组的方式组织,数组最后的元素NULL结尾(当程序拿到环境变量的时候,读取到NULL,说明已经读取完毕)。 char* env[] :本质上是一个数组,数组的元素是char*,每一个char*都指向一个环境变量(key = value)。

6.代码获取环境变量

6.1通过main函数的参数获取


main函数参数的含义:

  1. 可以在main函数内通过循环的方式打印输出环境变量的内容(循环条件:env[i] != NULL)

验证:for循环打印的内容和命令行直接输入env的结果一致

 这里的代码 没运行出来

 函数执行结果:

使用env命令

两者完全一致!!!
下面来谈一谈main函数的前两个参数

6.2argc:命令行中参数个数

6.3argv:命令行中参数具体内容

应用:可以写程序 ,更具不同的参数,执行不同的代码。

 6.4 environ(使用environ 获取环境变量)


extern char** environ:这个是全局的外部变量,在lib.so当中定义,使用的时候需要extern关键字
验证:

 

6.5 getenv

头文件 #include<stdlib.h>

char *getenv(const char *name);

参数:环境变量名称-->key

返回值:环境变量的值(value),没找到返回NULL。

 验证:
查看PTAH环境变量的内容

对比echo$PATH一样的效果

7进程虚拟地址空间

C语言当中的程序地址空间图(32位操作系统为例)

内存访问的基本单位是字节!!一个内存地址对应一个字节

代码

①单个进程打印全局变量的地址

 ②创建子进程,父子进程都打印全局变量的地址

 ③子进程修改全局变量的值,父子进程分别打印全局变量的地址和值

8.虚拟地址

1.我们在用C/C++语言所看到的地址,全部都是虚拟地址。物理地址用户一般情况下看不到,由OS统一管理
OS负责将程序当中的虚拟地址转换为物理地址,然后去物理内存里找内容。

不是程序地址空间而是    进程虚拟地址空间

8.1具体分配情况

2.操作系统为每一个进程虚拟出来一个4G的虚拟地址空间(32位操作系统),程序在访问内存的时候,使用的是虚拟地址进行访问。既然是操作系统虚拟出来 地址,所以并不能直接存储数据,存储数据还是在真实的物理内存当中。所以OS需要将虚拟地址转化为物理地址进行访问(页表)

9.三个经典问题

二, 为什么不能采用预先直接分配内存的方式给进程???

 三, 为什么32位操作系统,给进程分配的是4G的虚拟地址空间??

举报

相关推荐

0 条评论