1. 寄存器
CPU内有存在寄存器:可以临时的存储数据,非常少,但是非常重要!
寄存器分为可见寄存器和不可见寄存器。
当进程在被执行的过程中,一定会存在大量的临时数据,会暂时存在CPU的寄存器中!
int Add()
{
int a = 10+20;
return a;
}
int z = hello();
寄存器中数据的重要性?
我们把进程在运行中产生的各种寄存器数据叫做进程的硬件上下文数据。
当进程被剥离:需要保存上下文数据
当进程恢复的时候:需要将曾经保存的上下文数据恢复到寄存器中。
上下文保存在PCB(task_struct)进程控制模块中。
注意:要准确区分寄存器 vs 寄存器的数据!
寄存器只有一套,寄存器的数据历史上可能有多份!
2. 环境变量
2.1 概念
一个问题:为什么我们敲系统的指令(也是程序)不需要带路径,而自己写的可执行程序却要带上路径呢?
当我们写了一个myproc的可执行程序,我们直接敲入myproc会报错:
bash:myproc:command not found
执行一个可执行程序,前提是要先找到它!
所以上述问题也可以这样问:为什么系统·的命令能找到,而我们自己的程序却找不到呢?
系统中是存在相关的环境变量,保存了程序的搜索路径的!
Linux下敲入env就能查看所有环境变量,Windows下高级系统设置中就可以查看环境变量。
系统中搜索可执行程序的环境变量的命令是echo $PATH,系统中命令的路径存在PATH环境变量下的/usr/bin/目录中。
2.2 如何将程序添加进环境变量
第一种方法:将我们自己的可执行程序拷贝到/usr/bin/目录下
sudo cp myproc /usr/bin/
但是不推荐大家这样做,会污染Linux下的命令值。我们演示完删掉即可。
sudo rm /usr/bin/myproc
命令行可以定义的变量分两种:
- 普通变量
- 环境变量(全局)
export bbbb=321456 // 定义一个环境变量bbbb
env | grep bbbb // 查找bbbb环境变量
第2种方法:
export PATH=$PATH:可执行程序路径(pwd)
unset //取消环境变量
set | grep 变量名 //查询本地变量
3.环境变量的C、C++获取方式
main函数的命令行参数
argc记录的是命令行参数的个数,argv接收的是程序名和选项!!
意义是什么?
同一个程序,通过传递不同的参数,让同一个程序有不同的执行逻辑和执行结果!
Linux系统中会根据不同的选项让不同的命令可以有不同的表现!指令中那么多选项的由来和起作用的方式!!
其实main函数可以带第三个参数!一个进程是会被传入环境变量参数的!
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
3.1 获取环境变量的三种方式
- 命令行第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
for(int i = 0; env[i]; i++)
{
printf("env[%d]:%s\n", i, env[i]);
}
return 0;
}
- 通过第三方变量environ获取
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
for(int i = 0; environ[i]; i++)
{
printf("%d:%s\n", i, environ[i]);
}
return 0;
}
- getenv
#include <stdio.h>
int main(int argc, char *argv[])
{
char *val = getenv("PATH");
printf("%s\n", val);
return 0;
}
获取环境变量一定有特殊用途!
4.补充
命令行中启动的进程,父进程全都是BASH。BASH也是通过fork去创建子进程,至于是怎么样把我们写的代码加载进子进程的,怎样传入命令行参数的?我们下章进程控制再讲。
什么叫环境变量具有全局属性呢?环境变量是会被子进程继承下去的!!如果你在bash定义了一个环境变量,那么bash下的所有子进程都会继承这个环境变量的信息。
所谓本地变量,本质就是在bash内部定义的变量(不带export),不会被子进程继承下去!
残留问题:echo和export也是一条命令,也是子进程,它是如何读取本地变量的?
Linux下大部分命令都是通过子进程的方式执行的!但是,还有一部分命令,不通过子进程的方式执行,而是由bash自己执行(调用自己的对应的函数来完成特定的功能),我们把这种命令叫做内建命令!