【Linux】进程切换环境变量

news2024/11/26 23:36:46

目录

一.进程切换

1.进程特性

2.进程切换

 1.进程切换的现象

2.如何实现

 3.现实例子

2.环境变量

一.基本概念

二.常见环境变量

三.查询常见环境变量的方法

四.和环境变量相关的命令 

 五.环境变量表的组织方式

六.使用系统调用接口方式查询环境变量

1.getenv

 

 2.反思

七.通过代码的方式获取环境变量

 1.通过命令行参数

2.通过getenv函数

3.通过第三变量environ获取

八.环境变量通常具有全局属性

总结


 

进程属于Linux操作系统非常重要的一部分,建议大家在熟练掌握Linux进程相关概念的基础上,再观看本篇博客 

一.进程切换

1.进程特性

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级;
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰;但同时为了保证进程之间的独立性,也需要花费大量的资源。
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行;
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发.

2.进程切换

 1.进程切换的现象

大家在使用电脑时,可能会几个软件同时运行。日常使用的电脑大部分都是单核的,即同一时间仅执行一个进程。那为什么在电脑上可以同时打开多个软件呢?这就跟进程切换有关了。

2.如何实现

(1) 一个CPU里面存在一套硬件寄存器,寄存器分为用户可见的寄存器,用户不可见的寄存器。

(2) 计算机调度某个进程时,CPU 会把这个进程的 PCB 地址加载到某个寄存器,也就是说,CPU内有寄存器可以只找到进程的PCB地址。

(3) CPU里有一个 eip 寄存器(PC指针),指向当前执行指令的下一条指令的地址。

(4) 当进程在运行的时候,一定会产生非常多的临时数据,这些临时数据只属于当前进程,虽然CPU内部只有一套寄存器硬件,但是寄存器里面保存的数据是属于当前进程的,寄存器硬件和寄存器内的数据是两码事。

(5) 进程在调度的时候占有CPU,但是却不是一直占有到进程结束,进程都有自己的时间片!因为时间片的存在,进程会出现没有被执行完就被拿下去的情况。

(6) 在进程重新被CPU调度的时候,CPU必须知道上一次这个进程运行到哪,当进程被换下去的时候,进程的运行信息会被存在操作系统里面,以便下次CPU重新调度时进程能够正常运行,这叫做进程的上下文保护。当进程被CPU重新调度上来时,首先要做的第一件事情就是读取操作系统中进程运行的相关数据,这叫做进程的上下文恢复。

 3.现实例子

有一名同学大一下学期,相应国家号召,决定去当兵。然后他找到自己的辅导员老师,和老师讲了自己的决定,然后老师就找到了他的关于他的档案和学期末的考试情况,然后打印成了两份,一份留到学校,另一份然这位同学拿走。等到当兵结束后,这位同学拿着自己的档案回到了学校,学校通过比对是这两份档案,证实这位同学就是这些学校的学生,然后这位同学回到校园,继续他的大学生活。

这位同学当兵走的时候,拿走的档案就是自己的属性等信息。拿走食材为了能够更好的回来。学校就相当于CPU,档案就相当于寄存器内的数据。

2.环境变量

一.基本概念

1.环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所连接的动静态链接库的位置在哪,但是招样可以链接成功,生成可执行程序,原因就是相关环境变量帮助我们的编译器进行查找。

2.环境变量还有其他的特殊用处,还有在操作系统中通常具有全局特性。

 环境变量的存在,是为了满足操作系统在不同应用场景下的需求,在操作系统中创建的一部分全局变量。

二.常见环境变量

1.PATH:指定命令搜索路径。

2.HOME:指定用户的主工作目录(即用户登录到Linux系统时,默认的目录)。

3.SHELL:当前的shell,通常/bin/bash。

三.查询常见环境变量的方法

 创建一个hello.c

#include<stdio.h>
int main()
{
    printf("hello world\n");
}

大家有没有想过:为什么我运行自己生成的可执行程序都要使用 ./来说明是在当前路径下查找这个可自行程序;但是,我们用系统命令,如ls,就不用指是当前路径呢? 

 这是因为在系统中有一个名为PATH的环境变量,这个环境的作用就是保存命令搜索的路径。我们自己定义的环境变量由于没有PATH里的路径内,如果不手动添加路径,bash就会因为没有找到这个可执行程序而报错。

但是,这种对环境变量修改是一次性的。退出,然后再次登录时,系统会再次加载环境变量。

 

四.和环境变量相关的命令 

1.echo $+变量名:查询某个环境变量,如:echo $PATH查询PATH环境的内容。

2.env:显示操作系统内所有的环境变量。

2.export:设置一个新的环境变量。

4.unset:清除环境变量。

5.set:显示本地定义的shell变量和环境变量。

1.显示所有的环境变量:env

2.环境变量具有全局性,被所有进程所共享,如果不想让其他进程看到,可以设置本地环境变量:

3.如果设置的本地环境变量不想使用了,可以用unset清理掉。

 

4. export+某个环境变量,可以把这个环境变量导入环境变量集,退出重新登录,这个环境变量依旧存在。

 

 五.环境变量表的组织方式

环境变量表是以指针数组的形式存储的。

六.使用系统调用接口方式查询环境变量

1.getenv

函数原型:

char *getenv(const char *name);

name参数是要获取值的环境变量的名称。

该函数包含在#include<stdlib.h>里。

函数作用 :

getenv函数的作用是在当前进程的环境变量中查找指定名称的环境变量,并返回其值的指针。如果找到了对应的环境变量,则返回指向其值的指针;如果未找到,则返回NULL

使用实例 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char*user=getenv("USER");
    printf("%s\n",user);
}

所以,我们还可以根据这个函数做一些权限认证的工作。 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	const char* user = getenv("USER");
	const char* name = "root";
	if (strcmp(name, user) == 0)
	{
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");


	}
	else
	{
		printf("权限不足");
	}
}

上面这段代码,只有用root的身份才能去执行,否则,就会权限不足。 

 2.反思

我们都知道root是超级管理员,当我们做某些操作没有权限时,我们通常会用sudo命令提高一下权限,那么,sudo的本质是什么呢?

学到现在,我认为sudo的本质就是让USER内的用户名称变为root用户。只有这样,在做认证工作时,就会得到通过,操作就会的到处执行。 

七.通过代码的方式获取环境变量

 1.通过命令行参数

请大家先看这篇文章:关于main函数参数那点事

所以我们可以通过命令行参数的形式获取环境变量:

代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[],char *env[])
{
	int i = 0;
	while (env[i] != nullptr)
	{
		printf("%d:%s", i, env[i]);

	}
}

2.通过getenv函数

#include<stdio.h>
#include<stdlib.h>
int main()
{ 
    printf("%s",getenv("USER");
}

3.通过第三变量environ获取

首先:这个变量是系统给我们准备好的,无论我们是否使用,这个变量都是存在的。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    extern char **environ;
    int i = 0;
    while (*(environ + i))
    {
        printf("%d:%s\n", i, *(environ + i));
        i++;
    }
}

八.环境变量通常具有全局属性

环境变量通常具有全局属性,可以被子进程所继承。如果我们想定义一些不会被子进程所继承的变量,建议定义本地变量。

来看上面这段命令:当前路径下存在一个名为my.out的可执行程序。对其用ls命令。ls作为系统命令,是有默认搜索路径的,存放在PATH变量中。但是,系统为什么知道在那个路径下找my.out这个文件呢?

其实,在系统中,有一个PWD环境变量,这个环境变量存放当前所在路径的位置,然后在这个路径下查找这个指定的文件。

总结

进程切换

  • 系统中存在很多的进程,这些进程都是按照时间片来回切换的,只是切换的时间非常短,造成了一个进程一直在运行的假象。

环境变量

  • 环境变量是系统用来面对各种情况而建立的一些全局变量,我们创建的进程会继承父进程bash的环境变量,来完成身份认证,路径选择工作。
  • 查询环境变量可以通过参数列表、函数getenv、第三方变量environ获得
  • 除了系统给我们定义的环境变量外,我们也可以定义一些本地变量,有必要的话,也可以将本地变量export成环境变量。

写在最后:

因作者水平有限,难免会出现错误,阅读过程中,请大家指正!!

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1795267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自然语言处理】【Scaling Law】语言模型物理学 第3.3部分:知识容量Scaling Laws

语言模型物理学3.3&#xff1a;知识容量Scaling Laws 论文名称&#xff1a;Physics of Language Models: Part 3.3, Knowledge Capacity Scaling Laws 论文地址&#xff1a;https://arxiv.org/pdf/2404.05405 相关博客 【自然语言处理】【Scaling Law】Observational Scaling …

RTA_OS基础功能讲解 2.8-Tick计数器

RTA_OS基础功能讲解 2.8-Tick计数器 文章目录 RTA_OS基础功能讲解 2.8-Tick计数器一、计数器简介二、计数器配置三、计数器驱动3.1 软件计数器驱动3.1.1 递增软件计数器3.1.2 静态计数器接口3.2 硬件计数器驱动3.2.1 Advancing硬件计数器3.2.2 回调函数四、在运行时访问计数器属…

Xcode 打包报错Command PhaseScriptExecution failed with a nonzero exit code

解决办法: 1、在Xcode项目中 Pods -> Targets Support Files -> Pods-项目名 -> Pods-项目名-frameworks 中(大约在第44行) 加上 -f 2、CocoaPods版本太旧了,可以尝试升级CocoaPods版本 使用sudo gem update cocoapods更新cocoapods&#xff0c;问题将在1.12.1版本已…

lua vm 二: 查看字节码、看懂字节码

本文讲一讲如何查看 lua 的字节码&#xff08;bytecode&#xff09;&#xff0c;以及如何看懂字节码。 以下分析基于 lua-5.4.6&#xff0c;下载地址&#xff1a;https://lua.org/ftp/ 。 1. 查看字节码 1.1 方法一&#xff1a;使用 luac luac 是 lua 自带的编译程序&#x…

无线和移动网络

背景 两个重要的挑战 无线&#xff1a;通过无线链路通信移动&#xff1a;需要网络处理移动&#xff08;不同变换所接入的网络&#xff09;用户 无线网络中的组件 无线主机&#xff08;无线并不总是意味着移动的&#xff09;基站&#xff08;base station 或者叫AP&#xff0…

芝麻IP好用吗?来测试了!

作为老牌代理IP服务厂商&#xff0c;芝麻IP和青果网络代理IP都做的不错&#xff0c;市场上几乎可以是有口皆碑了&#xff0c;上次测试了青果网络的代理IP&#xff0c;效果表现得还挺不错&#xff0c;和他们自己宣传的以及客户对他们的评价大差不差。 总的来说&#xff0c;他们家…

纷享销客安全体系:物理与环境安全

纷享销客的物理设备托管在经过严格准入制度授权的TIER3级别以上的专业数据中心&#xff0c;这些数据中心均通过了等保三级与IS027001安全认证&#xff0c;确保电力、制冷等基础设施提供相应级别的冗余&#xff0c;以增强IDC环境的安全性。 业务操作系统平台采用当前广泛使用的…

解决 iOS 端小程序「saveVideoToPhotosAlbum:fail invalid video」问题

场景复现&#xff1a; const url https://mobvoi-digitalhuman-video-public.weta365.com/1788148372310446080.mp4uni.downloadFile({url,success: (res) > {uni.saveVideoToPhotosAlbum({filePath: res.tempFilePath,success: (res) > {console.log("res > &…

NocoDB开源的智能表格详解-腾讯文档本地替代品

文章目录 一、介绍二、docker-compose部署三、登录NocoDB四、NocoDB手册1. 创建项目2. 收集统计表2.1 添加字段2.2 编辑字段2.3 字段类型2.4 发布表格 3.创建表单3.1 创建表单3.2 分享表单3.3 填写检测单 4.创建看板5.创建画廊 一、介绍 可作为腾讯文档的本地电子表格替代品&a…

VS2019 QT无法打开 源 文件 “QTcpSocket“

VS2019 QT无法打开 源 文件 "QTcpSocket" QT5.15.2_msvc2019_64 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "QTcpSocket" auto_pack_line_demo D:\vs_qt_project\auto_pack_line_de…

OZON快蜗牛数据工具,OZON数据分析工具

在当今的电商时代&#xff0c;数据已经成为了商家们最宝贵的资产之一。无论是产品选品、市场定位&#xff0c;还是营销策略的制定&#xff0c;都离不开对数据的深入分析和精准把握。而在众多电商平台中&#xff0c;OZON以其独特的商业模式和庞大的用户群体&#xff0c;吸引了众…

Vue3项目准备:utils工具插件文件夹中封装request.js配置axios请求基地址及超时时间、请求拦截器、响应拦截器

token介绍 概念&#xff1a;访问权限的令牌&#xff0c;本质上是一串字符串 创建&#xff1a;正确登录后&#xff0c;由后端签发并返回 作用&#xff1a;判断是否有登录状态等&#xff0c;控制访问权限 注意&#xff1a;前端只能判断token有无&#xff0c;而后端才能判断tok…

【vue3+pinia+uniapp项目问题:使用pinia状态管理时store的数据更新,模板渲染视图不能实时更新】

在这里选择不同的学校后&#xff0c;发现store里面的数据打印出来能更新&#xff0c;但是使用store的数据打印出来并未实时更新且渲染在模板上&#xff0c;必须手动刷新视图才能更新。 原因是因为使用了解构赋值传入参数 解决方法 1.使用computed 现在视图能进行实时更新…

GA/T 1400视频汇聚平台EasyCVR级联后,平台显示无通道是什么原因?

国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有GA/T 1400、国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&#xff…

Servlet实现会话追踪登录功能(结合JDBC)

目录 1.技术要求 2.关于会话Session 生活例子 代码体现 1.存储到session 2.从session中拿出 3.完成登录功能 4.利用Session作追踪 关于jstl应用 关于EL表达式应用 注意 5.测试 1.技术要求 核心&#xff1a; &#xff08;1&#xff09;Servlet项目的搭建 &#x…

正邦科技(第10天)

这里写目录标题 任务一任务二任务三 任务一 下位机报上来的十进制数据进行解析&#xff1a; 360170 固定报文&#xff0c;一个F对应一个字节&#xff0c;温度值&#xff0c;湿度值&#xff0c;烟雾浓度值是十进制转16进制&#xff0c;告警状态需要高低位移位&#xff0c;然后再…

Apple开发者Identifier唯一身份标识创建

1. 选中Identifiers然后点击加号进入创建页面 2.选择要注册的标识类型 选择类型为App然后点击继续 输入应用描述与BundleID并勾选要开启的功能后点击继续 点击注册标识 注册成功后,会在标识列表中看到

Apple开发者macOS设备与描述文件Profile创建完整过程

安装并打开Apple Configurator 新建描述文件 输入macOS平台的描述文件的相关信息,然后选择证书 选择一个可用证书 存储描述文件 存储成功如下: 使用文本编辑器打开刚才保存的描述文件,找到设备名与UDID

MySQL8.3日志文件占用硬盘空间过大,释放方法

执行 reset master; 即可解决问题&#xff0c;我写了个任务&#xff0c;定期执行 执行后目录效果

Vue3学习记录(第一天)

Vue3学习记录_第一天 背景说明记录Vue3实现响应式前端的反射前端对象的属性赋值Vue3响应式实现过程稿前端移除对象的属性 背景 本次学习主要是看视频学习, 没有跟练, 但是很多知识点感觉又容易忘记. 所以通过笔记的方式输出一下. 说明 估计只能自己看懂, 如果能提供一些其他…