目录
③子进程修改全局变量的值,父子进程分别打印全局变量的地址和值
环境变量
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函数参数的含义:
- 可以在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的虚拟地址空间??