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 在插画…...

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

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...

GC1808:高性能音频ADC的卓越之选
在音频处理领域,高质量的音频模数转换器(ADC)是实现精准音频数字化的关键。GC1808,一款96kHz、24bit立体声音频ADC,以其卓越的性能和高性价比脱颖而出,成为众多音频设备制造商的理想选择。 GC1808集成了64倍…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)
文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...

Flask+LayUI开发手记(八):通用封面缩略图上传实现
前一节做了头像上传的程序,应该说,这个程序编写和操作都相当繁琐,实际上,头像这种缩略图在很多功能中都会用到,屏幕界面有限,绝不会给那么大空间摆开那么大一个界面,更可能的处理,就…...