Linux进程学习【三】
✨个人主页: Yohifo
🎉所属专栏: Linux学习之旅
🎊每篇一句: 图片来源
🎃操作环境: CentOS 7.6 阿里云远程服务器
Perseverance is not a long race; it is many short races one after another.
- 毅力不是一场漫长的比赛;是许多短跑一个接一个。
文章目录
- 📘前言
- 📘正文
- 📖环境变量
- 🖋️环境变量列表
- 🖋️添加环境变量
- 🖋️获取环境变量
- 📖主函数参数
- 🖋️三个参数
- 🖋️选项调用
- 📖进程优先级
- 🖋️优先级查看
- 🖋️优先级修改
- 📖进程特点
- 📘总结
📘前言
环境变量
是一个即陌生又熟悉的词,说陌生是因为大多数普通用户都接触不到 环境变量
配置,说熟悉是因为很多程序又都离不开 环境变量
,比如编写 Java
时需要提前安装 jdk
,配置好 Java
的环境,才能正常编写代码,python
也是需要配置编码环境;而在我们的 Linux
中也有环境变量
,由 环境变量
构成的集合称做 环境变量表
;我们还可以调整 进程
的优先级,使得 进程
运行更加灵活
📘正文
📖环境变量
首先需要先来看看什么是 环境变量
- 一般是指在操作系统中用来指定操作系统运行环境的一些参数
- 例如在编译程序时,我们是不关心动态库位于什么地方,编译器链接时也只需要通过对应的
环境变量
就能找到动态库进行链接 环境变量
有着自己的特殊用途,还有有些具有全局属性,可以供所有进程
共享
环境变量
有很多个,把它们聚在一起管理,就构成了 环境变量列表
环境变量列表
中的常见 环境变量
:
PATH
系统命令搜索路径USER
当前用户名PWD
当前所处路径
我们可用通过指令 echo $NAME
查看当前环境变量信息(NAME
指环境变量名)
//比如查看用户信息
$ echo $USER
🖋️环境变量列表
下面来看看 环境变量列表
长什么样
通过指令查看
$ env
环境变量表是以指针数组的形式存储的
也可以通过 set
指令查看 环境变量表
,不过 set
指令显示的内容比 env
多得多,因为 set
还会显示 本地环境变量
信息
$ set //显示更加丰富的环境变量表
这里简单说一下 PATH
的作用
Linux
中的各种指令都是用C语言
编写的程序,所以:运行指令 == 运行程序PATH
环境变量中有存储各种指令(程序)的路径,当我们直接输入指令时,OS会根据PATH
提供的路径搜索程序,找到了就会直接运行对应指令(程序)- 而我们自己编写的程序则是需要通过
./可执行程序
的方式运行,因为此时路径不被包含在PATH
变量中 - 总之:PATH 存储路径中若包含程序,可以直接通过程序名运行程序
- 这就是各种指令,如
ls
、pwd
、touch
的运行原理
我们可以通过这一特性,将自己的可执行程序路径添加到 PATH
变量中
//注意:路径为绝对路径
//不能写成 export PATH=路径 这样会把所有指令都覆盖
$ export PATH=$PATH:/home/Yohifo/linux/Explore/code/Test_2_21
现在可以像指令一样直接运行程序
注意: 普通用户添加的环境变量只有本次登录有效,下次再登录时,环境变量列表会被重置
普通用户修改 环境变量列表
没什么大问题,但 root
需要谨慎了,避免造成严重后果
除此之外,我们还可以把程序写在 /usr/bin
目录下,此时也是可以直接通过程序名运行程序的
如上就是安装、卸载应用原理
🖋️添加环境变量
shell
可以读取到命令和命令行,我们可以直接通过命令的方式添加 环境变量
先来看看比较简单的 本地变量
添加
环境变量表
具有全局属性,可以供所有子进程共享,倘若我们不想让 环境变量
被共享,可以设置 本地变量
$ TEST=private //可以直接在命令行中添加本地变量
现在的 TEST
环境变量是不被子进程共享的
如果想删除已经设置的 本地环境变量
,可以通过 unset NAME
移除设置
$ unset TEST //移除已设置的本地环境变量
想让 TEST
进入 环境变量表
也很简单,只需要加上关键字 export
$ export TEST=public //此时环境变量已进入环境变量表
🖋️获取环境变量
环境变量
针对的是特定的人在特定场合干特定的事,这句话读起来有点绕,实际上:
- 有许多
环境变量
存储的是用户的个人信息,不同用户的环境变量表
各不相同 - 我们可以利用
环境变量
做信息验证,根据不同变量(选项)执行不同操作
比如
ls
指令是显示当前目录下的文件信息,而ls -a
则是显示详细信息,原理很简单,调用ls
程序时传递了-a
这个选项,使得程序一对比,就知道要执行显示详细信息这个操作
环境变量表具有全局属性,程序运行时,环境变量表会传递给程序使用
因此我们可以在程序中获取 环境变量
- 通过全局变量
environ
(char**
类型)获取 - 通过函数
getenv(NAME)
获取,这个比较常用 - 通过
main
函数中的第三个参数char* envp[]
获取
前两种方式比较简单,可以通过一个小程序观察到,而最后一种方式 需要结合主函数参数 的知识观察,将放在下一个部分详细讲解
先来看看前两种方式获取 环境变量
#include<iostream>
#include<stdlib.h> //getenv 需要使用这个头文件
using namespace std;extern char** environ; //声明使用int main()
{//cout << "Hello environment variable!" << endl; //你好环境变量!int pos = 0;while(pos < 5){cout << environ[pos] << endl; //获取部分环境变量信息pos++;}cout << endl << "========================" << endl << endl;//通过函数获取cout << "PWD=" << getenv("PWD") << endl;return 0;
}
可以自己尝试通过
getenv
函数验证本地变量不进入环境变量表这个现象
指令 pwd
实现非常简单,通过 getenv("PWD")
获取信息,再输出即可,我们可以自己实现 mypwd
#include<iostream>
#include<stdlib.h>
using namespace std;int main()
{//调用程序,获取环境变量信息cout << getenv("PWD") << endl;return 0;
}
一些不带选项,且比较简单的指令,我们是 可以直接利用函数获取 环境变量
模拟实现
📖主函数参数
main
函数有两种写法:带参与不带参,平常我们都是使用不带参数的 main
函数作为程序入口,对于函数参数很少关注,今天就来看看 main
函数中的参数吧
🖋️三个参数
main
函数中有三个参数,分别是:
int argc
传入程序中的元素数,./程序名
算一个char* argv[]
传入程序中的元素表,由bash
制作,传给main
函数char* envp[]
环境变量表,所谓全局性就是指main
函数可以通过此参数获取到环境变量表的信息
如何证明它们存在呢?
程序就是最好的证明
#include<iostream>
using namespace std;int main(int argc, char* argv[], char* envp[])
{cout << "现在传入的有效元素数为:" << argc << endl;cout << "==========================" << endl;cout << "通过元素表打元素信息" << endl;int pos = 0;while(pos < argc){cout << argv[pos] << endl;pos++;}cout << "==========================" << endl;cout << "使用环境变量表获取前五个环境变量信息" << endl;pos = 0;while(pos < 5){cout << envp[pos] << endl;pos++;}return 0;
}
main 函数中的三个参数各有各的作用
enpv
也可以获取环境变量,效果等价于 environ
环境变量表
能被共享的本质: 环境变量表会通过传参数的形式传给程序使用
🖋️选项调用
argv
可以实现指定指令完成指定功能的任务
首先我们需要在程序中提前设置好不同选项的运行结果
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;//打印提示信息
void Usage(const char* str)
{cout << str << " -[a | b | c]" << endl;
}int main(int argc, char* argv[], char* envp[])
{//首先进行身份检验if(strcmp(getenv("USER"), "Yohifo") != 0){cout << "当前用户为:" << getenv("USER") << endl;cout << "非法使用他人程序,操作被拒绝!" << endl;return 0;}//确保选项只有一个if(argc != 2){cout << "指令错误,尝试重新输入" << endl;Usage(argv[0]);return 0;}//验证成功后,进行选项分流if(strcmp(argv[1], "-a") == 0){cout << "执行 a 任务" << endl;cout << "…………………………" << endl;cout << "任务执行完成" << endl; }else if(strcmp(argv[1], "-b") == 0){cout << "执行 b 任务" << endl;cout << "…………………………" << endl;cout << "任务执行完成" << endl; }else if(strcmp(argv[1], "-c") == 0){cout << "执行 c 任务" << endl;cout << "…………………………" << endl;cout << "任务执行完成" << endl; }else{cout << "指令错误,尝试重新输入" << endl;Usage(argv[1]);return 0;}return 0;
}
通过不同的选项,调用不同的功能,这就是 main
函数参数存在的意义
选项会同程序名一起,构成一张表,传给 char* argv[]
参数
这种玩法叫做 命令行参数
,后续学习中将会经常用到
📖进程优先级
进程
还有优先级之分,优先级高的 进程
会被优先调用
CPU 资源是有限的,需要合理分配
Linux
给我们提供了修改进程
优先级的权限,目的就是让我们对多任务运行进行合理处理,提高系统运行效率
🖋️优先级查看
在 进程
的PCB
信息中,还包含了这些信息:
UID
身份标识PRI
进程优先级,默认为 80NI
进程修正值,这个只有Linux
中有,配合修改优先级,范围为[-20, 19]
我们可以通过 ps
指令查看进程优先级情况
//注:其中的 myfile 是可执行程序名
$ ps -al | head -1 && ps -al | grep myfile //查看进程优先级信息
🖋️优先级修改
进程优先级
可以被修改,但很少有人会主动修改
修改步骤
- 输入
top
指令进入任务管理器 - 输入
r
进入修改模式 - 再根据想要修改的进程,输入
PID
- 最后输入
NI
值,完成修改
注意:
NI
值区间为[-20, 19]
,设置时超出部分无效- 修改优先级时,
最终优先级
=初始优先级
+NI值
,优先级的修改行为并不是连续的,每次都是在最开始的基础上进行修改(默认为 80) - 调度器不允许存在
优先级失衡
的情况,因此优先级修改不能太激进
📖进程特点
下面来简单小结一下进程的特点
- 竞争性:CPU 资源有限,
进程
间存在竞争 - 独立性:
进程
是相互独立运行的,互不干扰 (重要) - 并行:多个
进程
可以在多个 CPU 上同时运行 - 并发:在一个 CPU 下采用
进程
切换的方式运行多个进程
📘总结
以上就是有关进程学习【三】的全部内容了,本文主要研究对象是 环境变量
,知道了 环境变量表
的存在,以及主函数是如何得到 环境变量表
表并实际运用的;最后还谈到了 进程优先级
问题,学习了优先级修改的相关指令;进程
最大的特性之一就是 独立性
,父子进程
间会发生 写时拷贝
机制,这种神奇的现象是如何产生的呢?敬请期待下篇中关于 进程地址空间
的相关文章
如果你觉得本文写的还不错的话,期待留下一个小小的赞👍,你的支持是我分享的最大动力!
如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正
相关文章推荐
Linux进程学习【二】 Linux进程学习【一】 Linux工具学习之【gdb】 Linux工具学习之【git】 Linux工具学习之【gcc/g++】 Linux工具学习之【vim】 Linux 权限理解和学习
![]()
相关文章:

Linux进程学习【三】
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

Spring自动装配的底层逻辑
Spring是如何自动装配Bean的?看源码一些自己的理解,如有错漏,请指正 使用Spring之前我们要先去web.xml中设置一下Spring的配置文件,在Spring的配置文件中,是通过component-scan扫描器去扫描base-package底下所有的类装…...

华为OD机试 - 数组合并(C++) | 附带编码思路 【2023】
刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…...

在vue3+ts的项目中,如何解决vant组件自带表单校验不生效?
问题描述: 点击发送验证码后,为了让逻辑更加严谨,使用了vant组件自带的表单校验,进行二次校验,防止验证码发送成功后,登录手机号被二次修改,但根据官网描述cv之后不生效,甚至连获取…...

华为OD机试真题Python实现【子序列长度】真题+解题思路+代码(20222023)
子序列长度 题目 有 N 个正整数组成的一个序列 给定一个整数sum 求长度最长的的连续子序列使他们的和等于sum 返回次子序列的长度 如果没有满足要求的序列 返回-1 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 两行输入 第一行…...

【答疑现场】我一个搞嵌入式的,有必要学习Python吗?
【答疑现场】我一个搞嵌入式的,有必要学习Python吗? 文章目录1 写在前面2 一个结论3 Python在嵌入式领域能干啥事4 Python是用来干大事的5 友情推荐6 福利活动大家好,我是架构师李肯,一个专注于嵌入式物联网系统架构设计的攻城狮。…...

MySQL存表报错问题 Incorrect string value
MySQL存表报错问题 Incorrect string value 问题 Incorrect string value: ‘\xF0\xA8\xA5\xA5\xE5\xAD…’ for column ‘xxxxxxx’ at row 1 意思是错误的字符,常出现在添加中文字符的时候。这个问题的产生原因主要是因为一些特色中文字符或者Emoji表情占4个字…...

SAP ABAP DIALOG长文本编辑框
1. 在SCREEN100 中创建一个定制控制(容器),命名为PP *&---------------------------------------------------------------------* *& Report ZTEST_TEXT *& *&---------------------------------------------------------------------* *& *…...

电子技术——负反馈特性
电子技术——负反馈特性 本节我们进一步深入介绍负反馈特性。 增益脱敏性 假设 β\betaβ 是一个常数。考虑下面的微分方程: dAfdA(1Aβ)2dA_f \frac{dA}{(1 A\beta)^2} dAf(1Aβ)2dA 将上式除以 AfA1AβA_f \frac{A}{1A\beta}Af1AβA 得到࿱…...

网站移动端性能优化方法
移动端优化 click 的 300ms 延迟响应 click 的 300ms 延迟是由双击缩放(double tap to zoom)所导致的,由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行双击操作。因此,移动端浏览器就等…...

2023年AI语音会议汇总
2023年,AI语音领域学术会议精彩纷呈,语音之家汇总了国内外重要的会议呈现给大家,大家可根据时间统筹安排好2023年的学术活动交流行程。如果信息有误,欢迎指正。 ICASSP 2023 2023 IEEE International Conference on Acoustics, S…...

Mybatis持久层框架 | Mapper加载方式、目录结构解析
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Mapper(resource、class、package)加载方式 resource方式加载 通过resource或url加载单个mapper,接口文件与映射文件不在同一路径下,只能用re…...

九龙证券|创业板向未盈利企业敞开大门 考验投行估值定价能力
未盈余企业上市有了新选择。2月17日,全面实行股票发行注册制相关准则规矩发布施行。深交所发布《深圳证券交易所创业板股票上市规矩(2023年修订)》及《关于未盈余企业在创业板上市相关事宜的告诉》,“预计市值不低于50亿元&#x…...

「TCG 规范解读」第12章 TPM工作组 TCG身份验证研讨
可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…...

Logstash:在 Logstash 管道中的定制的 Elasticsearch update by query
我们知道 Elasticsearch output plugin 为我们在 Logstash 的 pipeline 中向 Elasticsearch 的写入提供了可能。我们可以使用如下的格式向 Elasticsearch 写入数据: elasticsearch {hosts > ["https://localhost:9200"]index > "data-%{YYYY.M…...

Spring Cloud Kubernetes环境下使用Jasypt
前言最近半年着手开始做了基于微服务的中台项目,整个项目的技术栈采用的是Java Spring Cloud Kubernetes Istio。业务开放上还是相当顺利的。但是在安全审核上,运维组提出了一个简易。现在项目一些敏感配置,例如MySQL用户的密码࿰…...

Kotlin-面向对象
本片博客主要写创建对象,创建接口,创建抽象类,data关键字的作用 创建对象 如何声明一个对象,使用class关键字 格式为: class 对象名字(对象属性名:属性类型…){} 如果对象没有函数…...

循环、函数、对象——js基础练习
目录 一、循环练习 1.1 取款机案例 1.2 九九乘法表 1.3 根据数据生成柱形图 1.4 冒泡排序 1.6综合大练习 二、函数 2.1 转换时间案例 三、对象 1. 遍历数组对象 2. 猜数字游戏 3. 生成随机颜色 4. 学成在线页面渲染案例 一、循环练习 1.1 取款机案例 // 准备一个…...

精确控制 AI 图像生成的破冰方案,ControlNet 和 T2I-Adapter
ControlNet 和 T2I-Adapter 的突破性在哪里?有什么区别?其它为 T2I 扩散模型施加条件引导的相关研究ControlNet 和 T2I-Adapter 的实际应用效果如何?使用体验上,跟 SD原生支持的 img2img 有什么区别?ControlNet 在插画…...

让师生“不跑腿”,教育数据治理究竟有何魔力
当前,教育信息化新基础设施正在加紧建设,教育业务系统应用不断推进,各种软硬件平台源源不断地产生着教育数据。海量数据的汇聚和分析,能给教育系统带来什么?如何在教育数字化转型中,探索出基于数据驱动的新…...

力扣-寻找用户推荐人
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:584. 寻找用户推荐人二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.其他总结前言 一、题目:…...

mmdetection测试阶段
首先需要训练,训练会自动生成:latest.pth 权重文件 根据权重文件生成“.pkl”文件; 下面以faster_rcnn为例,–out是只生成的权重文件地址,result是生成的pkl文件名; python ./tools/test.py ./configs/…...

【无标题】10.货币系统
题目描述: 在网友的国度中共有 n 种不同面额的货币,第 i 种货币的面额为 a[i],你可以 假设每一种货币都有无穷多张。为了方便,我们把货币种数为 n、 面额数组为 a[1..n] 的货币系统记作 (n,a)。 在一个完善的货币系统中,每一个非…...

【c++】类和对象6—运算符重载
文章目录加号()运算符重载左移(<<)运算符重载递增()运算符重载赋值()运算符重载关系运算符重载函数调用运算符重载运算符重载概念: 对已有的运算符重新进行定义&am…...

【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

6、Fatfs系统移植
注意:挂载Fatfs笔记 Fatfs系统读写文件的时间是不固定的,随机性 搭载Fatfs的外设通信方式建议开启DMA方式,否则应避免中断打断时序,导致Fatfs出现FR_DISK_ERR(A hard error occurred in the low level disk I/O layer&…...

【数据结构与算法】数据结构的基本概念,时间复杂度
🍉内容专栏:【数据结构与算法】 🍉本文脉络:数据结构和算法的基本概念,时间复杂度 🍉本文作者:Melon西西 🍉发布时间 :2023.2.21 目录 一、引入: 二、数据结…...

【Python】变量类型,赋值+多个变量赋值
嗨害大家好鸭~我是小熊猫(✿◡‿◡) 好像还有一些小伙伴还不是很会python的基础鸭~ 没关系啦~这不是还有我小熊猫嘛 ~ 源码资料电子书:点击此处跳转文末名片获取 Python 变量类型 变量是存储在内存中的值, 这就意味着在创建变量时会在内存中开辟一个空间。 基于…...

Qt基础之二十九:图形视图框架(Graphics View Framework)及其应用
无意中从网络获取一份俄罗斯方块源码,基于图形视图框架(Graphics View Framework)实现的。当然源码的核心从来都不是界面,而是方块的移动、变形和消除等算法。源码非常完整,注释详细,经改动后已能在Qt5中运行,下面是运行效果,背景音乐和音效也是有的。 一.效果 二.原理 …...

电商平台销量查询:2023年1月牛奶乳品热门排行榜
随着人们消费能力的提升以及健康意识的增强,牛奶乳品已经成为居民日常饮食中的重要组成部分,伴随人们整体消费的增长,牛奶乳品行业也越来越成熟。 今年1月份我国牛奶乳品行业的整体趋势如何呢?结合数据我们一同来分析!…...