环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
常见环境变量
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录
- HISTSIZE:保存历史命令记录的条数
- SHELL:当前的shell,它的值通常是/bin/bash
相关命令
- echo :显示某个环境变量的值
- export:设置一个新的环境变量,设置的环境变量是临时的
- env:显示所有环境变量
- unset:清除环境变量
- set:设置本地定义的shell变量和环境变量
编写一个test.c程序并编译生成可执行程序,通常执行可执行程序要./test,而把可执行程序所在路径添加到环境变量中:export PATH = $PATH:test文件所在路径,可直接输入test执行可执行程序
组织环境变量
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以'\0'结尾的环境字符串
代码获取环境变量
#include <iostream>
#include <stdlib.h>
int main(int argc, char* argv[], char* env[]){
//命令行第三个参数
for(int i = 0; env[i]; ++i){
cout << env[i] << endl;
}
//第三方变量environ
//全局变量environ是一个指向环境变量的全局变量,不包含在头文件中,要用extern声明
extern char** environ;
for(int i = 0; environ[i]; ++i){
cout << environ[i] << endl;
}
return 0;
}
getenv
- char* getenv(const char* name)
- 获取环境变量的内容,name为环境变量名称
putenv
- int putenv(const char* name)
- 改变环境变量的内容,如果环境变量存在,则内容会依参数改变,否则该参数是新的环境变量
环境变量的特性
进程地址空间
- 在所有的高级语言中看到的地址全是虚拟地址,物理地址用户看不到,由操作系统统一管理
- 同一个变量地址相同指的是虚拟地址相同,它们通过页表映射到了不同的物理地址
- 每个进程都有一个PCB、虚拟地址空间、页表和维护映射关系
- 当父进程创建一个子进程时,如果只读,父进程的代码和数据是共享的,也就是虚拟地址空间和页表是共享的,但是如果有一方试图修改数据,父子进程以写时拷贝的方式保证数据各自私有一份副本,之所以采用写时拷贝而不是在创建PCB直接拷贝是为了更合理的使用内存空间
虚拟地址空间作用
- 保护物理内存
- 32位机器的每个虚拟地址空间都是4G,可以认为每个进程有4G的空间