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

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

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...