当前位置: 首页 > news >正文

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 存储路径中若包含程序,可以直接通过程序名运行程序
  • 这就是各种指令,如 lspwdtouch 的运行原理

区别
指令
我们可以通过这一特性,将自己的可执行程序路径添加到 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 进程优先级,默认为 80
  • NI 进程修正值,这个只有 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进程学习【三】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

Spring自动装配的底层逻辑

Spring是如何自动装配Bean的&#xff1f;看源码一些自己的理解&#xff0c;如有错漏&#xff0c;请指正 使用Spring之前我们要先去web.xml中设置一下Spring的配置文件&#xff0c;在Spring的配置文件中&#xff0c;是通过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组件自带表单校验不生效?

问题描述&#xff1a; 点击发送验证码后&#xff0c;为了让逻辑更加严谨&#xff0c;使用了vant组件自带的表单校验&#xff0c;进行二次校验&#xff0c;防止验证码发送成功后&#xff0c;登录手机号被二次修改&#xff0c;但根据官网描述cv之后不生效&#xff0c;甚至连获取…...

华为OD机试真题Python实现【子序列长度】真题+解题思路+代码(20222023)

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

【答疑现场】我一个搞嵌入式的,有必要学习Python吗?

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

MySQL存表报错问题 Incorrect string value

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

SAP ABAP DIALOG长文本编辑框

1. 在SCREEN100 中创建一个定制控制(容器)&#xff0c;命名为PP *&---------------------------------------------------------------------* *& Report ZTEST_TEXT *& *&---------------------------------------------------------------------* *& *…...

电子技术——负反馈特性

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

网站移动端性能优化方法

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

2023年AI语音会议汇总

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

Mybatis持久层框架 | Mapper加载方式、目录结构解析

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Mapper(resource、class、package)加载方式 resource方式加载 通过resource或url加载单个mapper&#xff0c;接口文件与映射文件不在同一路径下&#xff0c;只能用re…...

九龙证券|创业板向未盈利企业敞开大门 考验投行估值定价能力

未盈余企业上市有了新选择。2月17日&#xff0c;全面实行股票发行注册制相关准则规矩发布施行。深交所发布《深圳证券交易所创业板股票上市规矩&#xff08;2023年修订&#xff09;》及《关于未盈余企业在创业板上市相关事宜的告诉》&#xff0c;“预计市值不低于50亿元&#x…...

「TCG 规范解读」第12章 TPM工作组 TCG身份验证研讨

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

Logstash:在 Logstash 管道中的定制的 Elasticsearch update by query

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

Spring Cloud Kubernetes环境下使用Jasypt

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

Kotlin-面向对象

本片博客主要写创建对象&#xff0c;创建接口&#xff0c;创建抽象类&#xff0c;data关键字的作用 创建对象 如何声明一个对象&#xff0c;使用class关键字 格式为&#xff1a; class 对象名字(对象属性名&#xff1a;属性类型…)&#xff5b;&#xff5d; 如果对象没有函数…...

循环、函数、对象——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 的突破性在哪里&#xff1f;有什么区别&#xff1f;其它为 T2I 扩散模型施加条件引导的相关研究ControlNet 和 T2I-Adapter 的实际应用效果如何&#xff1f;使用体验上&#xff0c;跟 SD原生支持的 img2img 有什么区别&#xff1f;ControlNet 在插画…...

让师生“不跑腿”,教育数据治理究竟有何魔力

当前&#xff0c;教育信息化新基础设施正在加紧建设&#xff0c;教育业务系统应用不断推进&#xff0c;各种软硬件平台源源不断地产生着教育数据。海量数据的汇聚和分析&#xff0c;能给教育系统带来什么&#xff1f;如何在教育数字化转型中&#xff0c;探索出基于数据驱动的新…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...