目次
一、前言
二、正文
1.其他概念
①竞争性
②独立性
③并行
④并发
2.环境变量
①基本概念
②常见环境变量
编辑
③相关指令
④环境变量表
⑤获取环境变量
三、结语
一、前言
在上一节中,我们举行了进程状态和优先级的讲解,而本文将继续为各人先容进程的环境变量!
二、正文
1.其他概念
在举行进程的环境变量讲解之前,还需先对上节课进程的状态和优先级小小收一个尾,即进程的相关概念或名词
①竞争性
竞争性:系统进程数目浩繁,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更公道竞争相关资源,便具有了优先级
②独立性
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
③并行
并行: 多个进程在多个CPU下分别,同时举行运行,这称之为并行
④并发
并发: 多个进程在一个CPU下接纳进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
对于并行,相信各人肯定能够理解,CPU就像人类的大脑,你有多个CPU天然就可以同时实行多个进程,但是对于家用的计算机来言一般是只有一个CPU的,那么这时候就需要依赖这一个CPU来举行多个进程的实行,这时候就需要接纳并发的情势。
对于并发,我们要想继续了解它,那么就要了解CPU是怎样举行进程切换的。
在进程切换这个过程中,一个重要的术语是“时间片”。所谓时间片,就是CPU以为一个进程最多应该实行的时间,一旦实行的时间凌驾时间片或者是进程实行完毕,就应该将当前进程从运行队列中取下,从而实行下一个进程。那么为什么要有时间片呢?是为了解决一个进程如果在实行的过程中如果不绝处于等候的过程,如果不将其取下,其他的进程就不能被实行,因而时间片是一个进步CPU工作服从的方法。所以并发是一种基于进程切换基于时间片轮转的调度算法
既然这样,相信有的小伙伴又会问,那进程在切换的时候,万一它还没实行完毕,就被CPU取下来,那它的一些数据处理,状态等等资源,即进程上下文是怎么处理的呢?
在解答之前,先来问问小伙伴,不知道你们有没有思索过,在C/C++语言中,无论是main函数照旧其他函数,对于它的返回值,为什么会被外部拿到呢,我们不都说返回的是一个暂时变量吗?这就涉及到“寄存器”了。在CPU中,存在大量的寄存器,通过寄存器,就能将返回值放到一个寄存器,从而被外部获取。
在C/C++学习中,我们也了解了一个程序的结构有顺序,分支,循环等,那么CPU是怎么知道代码要怎么实行的呢,这也离不开寄存器,通过程序计数器pc(或eip)我们就能够知道程序要怎么实行了,由于这个寄存器能够记录当前进程正在实行指令的下一行指令的地址
通用寄存器:eax,ebx,ecx,edx
栈帧相关:ebp,esp,eip
状态寄存器:status
上面是一些常见的寄存器类型,那么寄存器在CPU中到底饰演什么脚色呢?其实寄存器是资助来进步CPU服从,CPU可以将进程高频数据放到寄存器中,因此到这里我们也就知道了CPU内寄存器内里保存的是进程相关的暂时数据,即进程的上下文,可以被访问或者修改。进程在从CPU上离开的时候,要将自己的上下文数据保存好甚至带走,这是为了未来再度被实行时的恢复进程上下文。所以一个进程在被切换的时候最重要的是:保护上下文、恢复上下文
回归正文,要怎样保护进程上下文呢,我们可以先简朴理解并不是放到CPU里,而是被每一个进程打包带走。
2.环境变量
①基本概念
●环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
●如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照旧可以链接乐成,天生可实行程序,缘故原由就是有相关环境变量资助编译器举行查找。
●环境变量通常具有某些特别用途,另有在系统当中通常具有全局特性
②常见环境变量
●PATH : 指定命令的搜索路径
●HOME : 指定用户的主工作目次(即用户登岸到Linux系统中时,默认的目次)
●SHELL : 当前Shell,它的值通常是/bin/bash。
PATH环境变量
PATH这个环境变量提供指令查找的路径,这也就是为什么当我们实行诸如ls,mkdir等指令能够实行,而我们自己写的指令,比如说copy则不行,需要带上./copy才可以
检察PATH环境变量
添加PATH环境变量(不加¥PATH:,默认是覆盖写)
HOME环境变量
HOME环境变量能够指示当前用户为谁
检察HOME环境变量
SHELL环境变量
检察SHELL环境变量
③相关指令
1. echo: 表现某个环境变量值
2. export: 设置一个新的环境变量
3.env: 表现所有的环境变量
4.unset:清楚环境变量
5.set:表现当地界说的shell变量和环境变量
env:检察所有的环境变量
export:增长环境变量 (留意没有export则为当地变量)
unset:取消环境变量
set:检察当地变量和环境变量
那么当地变量与环境变量有什么区别呢,对于当地变量,只会在本BASH内部有效,不会被继承,而环境变量是会继承的。但是小伙伴有没有想到为什么当我们是有echo指令的时候却能够打印出当地变量,当我们实行echo指令的时候按道理也是创建了一个子进程,既然子进程并没有继承父进程的当地变量,为什么还能够实行指令乐成呢?
这就涉及命令的两种类型:
1.通例命令--通过创建子进程完成的
2.内建命令--bash不创建子进程,而是由自己切身实行,类似于bash调用了自己写的,或者系统提供的函数,而后者常见的有echo和cd,下面我们就模拟实现下cd命令
- 1 #include<stdlib.h>
- 2 #include<stdio.h>
- 3 #include<string.h>
- 4 #include<unistd.h>
- 5
- 6 int main(int argc,char* argv[],char* env[])
- 7 {
- 8 sleep(30);
- 9 printf("change begin\n");
- 10 if(argc==2)
- 11 {
- 12 chdir(argv[1]);
- 13 }
- 14 printf("change end\n");
- 15 sleep(30);
- 16
- 17 return 0;
- 18
- 19 }
复制代码
④环境变量表
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
⑤获取环境变量
●命令行第三个参数
- #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;
- }
复制代码 ●通过第三方变量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;
- }
复制代码 libc中界说的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在利用时 要用extern声明。
通过系统调用获取或设置环境变量
●getenv
通过getenv这个系统接口,只需要知道环境变量的名字,我们就可以获取到该环境变量的内容。例如,通过查询USER这个环境变量,我们就可以实现一个简朴的权限管理。
- 1 #include<stdlib.h>
- 2 #include<stdio.h>
- 3 #include<string.h>
- 4
- 5 int main()
- 6 {
- 7 char who[32];
- 8 strcmp(who,getenv("USER"));
- 9
- 10 if(strcmp(who,"root")==0)
- 11 {
- 12 printf("让他做任何事情\n");
- 13 }
- 14 else
- 15 {
- 16 printf("你就是一个普通用户,受权限约束\n");
- 17 }
- 18
- 19 return 0;
- 20
- 21 }
复制代码 三、结语
到此为止,本文有关环境变量的讲解就到此竣事了,如有不足之处,欢迎小伙伴们指出呀!
关注我 _麦麦_分享更多干货:_麦麦_-CSDN博客
各人的「关注❤️ + 点赞 |