【Linux】进程切换环境变量
目录
一.进程切换
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成环境变量。
写在最后:
因作者水平有限,难免会出现错误,阅读过程中,请大家指正!!
相关文章:
【Linux】进程切换环境变量
目录 一.进程切换 1.进程特性 2.进程切换 1.进程切换的现象 2.如何实现 3.现实例子 2.环境变量 一.基本概念 二.常见环境变量 三.查询常见环境变量的方法 四.和环境变量相关的命令 五.环境变量表的组织方式 六.使用系统调用接口方式查询环境变量 1.getenv 2.反思 …...
嵌入式学习记录6.6(拷贝构造/友元函数/常成员函数)
一.拷贝构造函数和拷贝赋值函数 1.1拷贝构造函数功能,格式 拷贝构造函数是一种特殊的构造函数,用来将一个类对象给另一个类对象初始化使用的。 1> 用一个类对象给另一个类对象初始化时,会自动调用拷贝构造函数。 2> 当一个类对作为函数的实参&…...
宝塔 nginx 配置负载均衡 upstream
nginx 主配置文件加入 upstream myapp1 {server 192.168.124.101:5051;server 192.168.124.102:5052;server 192.168.124.111:5050;}站点配置文件中加入 location / {proxy_pass http://myapp1;}80端口映射到外网域名配置方法 加入红框中的代码 upstream myapp3 {server 192.16…...
idea 插件推荐
idea 插件推荐 RESTFul-Tool 接口搜索Show Comment 代码注释展示translation 翻译(注释翻译)MyBatisCodeHelperPro 日志封装sql xml跳转GitToolBox 展示GIT提交Jenkins Control idea jenkins 集成Gitmoji Plus: Commit Button GIT提交moji表情 RESTFul-Tool 接口搜索 https://…...
【Linux】Linux环境基础开发工具_5
文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条,不过那仅仅是测试,接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…...
Java Web学习笔记15——DOM对象
DOM: 概念:Document Object Model: 文档对象模型 将标记语言的各个组成部分封装为对应的对象: Document: 整个文档对象 Element:元素对象 Attribute: 属性对象 Text:文本对象 Comment&a…...
中电联系列一:rocket手把手教你理解中电联协议!
分享《一套免费开源充电桩物联网系统,是可以立马拿去商用的!》 第1部分:总则 Charging and battery swap service information exchange for electric vehicles Part 1:General 前 言 T/CEC102—2016《 电动汽车充换电服务信息交换》分为四…...
(面试官问我微服务与naocs的使用我回答了如下,面试官让我回去等通知)微服务拆分与nacos的配置使用
微服务架构 正常的小项目就是所有的功能集成在一个模块中,这样代码之间不仅非常耦合,而且修改处理的时候也非常的麻烦,应对高并发时也不好处理,所以 我们可以使用微服务架构,对项目进行模块之间的拆分,每一…...
冯喜运:6.7今日黄金原油行情分析及独家操作策略
【黄金消息面分析】:周三(6月5日),金价回升逾1.2%,收盘报每盎司2,355.49美元,全面收复前一交易日的跌幅。周三当天前公布的美国民间就业数据弱于预期,增强了美联储将在今年晚些时候降息的预期&a…...
Android 蓝牙概述
一、什么是蓝牙 蓝牙是一种短距离(一般10m内)无线通信技术。蓝牙技术允许固定和移动设备在不需要电缆的情况下进行通信和数据传输。 “蓝牙”这名称来自10世纪的丹麦国王哈拉尔德(Harald Gormsson)的外号。出身海盗家庭的哈拉尔德统一了北欧四分五裂的国…...
Python3 笔记:字符串的 find()、rfind()、index()、rindex()
1、find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中…...
【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法
文章目录 前言 背景介绍 初始代码 优化代码 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 背景介绍 在一个嵌入式软件开发项目中,需要设计一个ECU节点的CAN网路数据发送,需求是在500k的通信波特率上&a…...
Python 设计模式(行为型)
文章目录 策略模式场景示例 迭代器模式场景示例 访问者模式场景示例 观察者模式场景示例 命令模式场景示例 模板方法模式场景示例 模板方法模式场景示例 事件驱动模式场景示例 责任链模式场景示例 中介者模式场景示例 状态模式场景示例 策略模式 策略模式(Strategy…...
电商API商品数据采集接口||助力电商企业采集商品大数据提高开发效率
提高开发效率:电商API接口允许不同的应用程序之间高效地进行交互,节省了大量的人力物力成本,使得开发者可以将更多时间和精力集中于自身的核心业务。 增加数据安全性:通过对数据进行安全加密,API接口实现了对数据的保护…...
Day34 事件聚合器实现消息过滤功能
当前章节,实现了消息事件过滤功能 在上一章节中,我们发现在Login视图页和Main视图页都使用了同一个事件聚合器,导致在Login视图页发送的消息也被Main 视图主页所接收,这违反了事件传递的意图和模块化设计的原则。为了解决这个问题,我们需要为事件聚合器引入消息过滤的…...
前端 JS 经典:Reflect 本质
1. 什么是 Reflect Reflect 可以调用对象的基本方法(内部方法),在 ES6 之前我们是没有任何方法去直接调用对象的基本方法的。只能间接调用,间接调用它又会给你做一些额外得事。 2. 对象的基本方法 什么是对象的基本方法呢&…...
accelerate 的一个tip:early stopping 处可能存在的bug
在分布式训练中进行提前停止时,如果每个进程都有特定的停止条件(例如验证损失),这可能不会在所有进程中同步。 因此,可能在进程 0 中发生中断,而进程 1 则不会——>这将导致代码无限期挂起,直…...
企业数据挖掘建模平台极简建模流程
泰迪智能科技企业数据挖掘建模平台是企业自主研发,面向企业级用户的快速数据处理构建模型工具。平台底层算法基于R语言、Python、Spark等引擎,使用JAVA语言开发,采用 B/S 结构,用户无需下载客户端,可直接通过浏览器进…...
使用pkg打包了一个使用了sqlite3的nodejs项目,启动后闪退
从截图来看,问题出在 sqlite3 模块上。说明在打包过程中,sqlite3 模块的 .node 文件没有正确加载。 紧急解决方法: 其实就是exe文件还需要node_modules中的sqlite3 依赖,我们直接在系统顶级放一个node_modules,且其中只…...
网络编程(UPD和TCP)
//发送数据 //UDP协议发送数据 package com.example.mysocketnet.a02UDPdemo;import java.io.IOException; import java.net.*;public class SendMessageDemo {public static void main(String[] args) throws IOException {//发送数据//1.创建DatagramSocket对象(快递公司)//…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
