Linux:进程优先级及环境

一:孤儿进程

在Linux系统中,当一个进程创建了子进程后,如果父进程执行完毕或者提前退出而子进程还在运行,那么子进程就会成为孤儿进程。子进程就会被systemd(系统)进程收养,其pid为1

myprocess.c代码

  1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 5 int main()6 {7     pid_t id = fork();8     if(id == 0)9     {10         //child11         while(1)12         {13             printf("我是一个子进程,我的pid:%d,ppid:%d\n",getpid(),getppid());14             sleep(1);15         }16     }17 18     else19     {20         //parent21         int cnt = 3;22         while(cnt)23         {24             printf("我是一个父进程,我的pid:%d,ppid:%d\n",getpid(),getppid());25             cnt--;26             sleep(1);27         }28     }29 30     return 0;31 }

如上面myprocess.c代码所示,子进程会一直执行,而父进程执行三次之后就会退出,因此子进程就会成为孤儿进程,子进程就会变成后台进程 ,如下图所示

 孤儿进程要想杀掉,不能使用Ctrl + C,只能同时打开两个XShell通过kill -9 + pid

二:进程优先级

2.1 优先级 
2.1.1 含义:

进程得到CPU资源的先后顺序就是进程优先级

2.1.2 意义:

目标资源稀缺是,导致进程要通过优先级确认谁先谁后的问题

2.1.3 规则:

原则上来说,优先级也是一个数字,数值越小,优先级越高;反之数值越大优先级越低

优先级数值范围为[60,99]共40个优先级

2.2 优先级查看

   命令:

        ps -al | head -1 && ps -al | grep myprocess

执行该命令后,首先会显示进程信息的标题行,接着显示所有名称包含 myprocess 的进程详细信息。 

myprocess.c代码

  1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 5 6 int main()7 {8     pid_t id = fork();9     if(id == 0)10     {11         //child12         while(1)13         {14             printf("我是一个子进程,我的pid:%d,ppid:%d\n",getpid(),getppid());15             sleep(1);16         }17     }18 19     else20     {21         //parent22         while(1)23         {24             printf("我是一个父进程,我的pid:%d,ppid:%d\n",getpid(),getppid());25             sleep(1);26         }   27     }  28     return 0;29 }

如上图所示,执行该命令后,打印出了myprocess代码中的进程信息,其中PRI是进程的优先级,默认值为80;NI是进程优先级的修正数据,也称为nice值。进程的真实优先级 就为默认PRI 和 NI两者的和。所以myprocess的进程优先级为默认PRI(80) + NI(0) = 80

2.3 top修改优先级

同时打开两个XShell,一个开始运行代码,另一个输入top命令,,然后输入r,按照提示输入需要修改优先级的进程pid来重新调整优先级,然后输入数字表示想要将进程的NI值修改成多少,然后按Ctrl+ c退出即可

 

如上图所示,原本进程的PRI为80,NI为0,我们使用top命令修改NI值为10之后,进程的PRI变为90,NI变为10,那么进程优先级90是怎么得来的,即默认PRI(80) + NI(10) = 90

2.4 renice修改进程优先级

在Linux中,renice命令用于修改已经运行进程的优先级,也就是调整进程的NI值

基本语法:

renice 设置nice数值 -p 进程ID(PID)

  • nice值的范围为-19  ~  20
  • -p 用于指定进程ID

如上图所示,执行renice -100 -p 1938344该命令后,系统会尝试将进程ID为1938344的进程的nice值设置为-100。从上图我们可以看到,我们明明是将nice值设置为-100了,为什么打印出来的是

-20呢。这是因为nice值的最低取值范围为-20,而我们使用renice 100 -p 1938344命令将进程ID为1938344的进程的nice值设置为100时,最后的nice值却为19,所以nice值的最高取值范围为19

有上面可知,进程优先级的取值范围为[80 + (-20),80 + 19]即,[60,99]

三:环境变量

在Linux系统中,环境变量是一种具有特定名称的对象,其作用是存储系统运行环境的相关信息。这些信息能够被运行在系统上的进程所使用,为系统和应用程序的运行提供必要的配置和参数。

3.1 前导知识 

我们知道如果我们执行系统命令不用加上路径就可以执行,而我们执行自己的命令如果不加上路径就会报错。但是系统命令和我们自己写的命令两者没有本质区别,而且要执行一个程序我们必须先找到它,而系统命令由于存在环境变量来帮助系统找到目标文件        

code.c代码:

  1 #include<stdio.h>2 #include<string.h>3 4 int main(int argc,char* argv[])5 {   6     if(argc != 2)7     {   8         printf("Usage:%s [-a|-b|-c]\n",argv[0]);9         return 1;10     }11     12     const char* arg = argv[1];13     14     if(strcmp(arg,"-a")==0)15         printf("这是功能1\n");16     else if(strcmp(arg,"-b")==0)17         printf("这是功能2\n");18     else if(strcmp(arg,"-c")==0)19         printf("这是功能3\n");20     else21         printf("Usage:%s [-a|-b|-c]\n",argv[0]);22     return 0;23 }

 

如上图所示:实行./code -a/-b命令系统就能正常执行,但是实行code -a就不行,这是因为code.c是我们自己写的程序代码,要加上路径才能执行,./code -a就代表在当前路径下寻找code这个可执行文件,而不带./就默认在系统环境变量中寻找,没有找到就报错了

3.2 环境变量PATH

这个变量保存了可执行文件的搜索路径,系统在查找可执行文件时,会按照PATH中指定的路径依次进行搜索

echo $PATH

如上图所示,我们使用echo $PATH命令后,系统就会将所有的环境变量PATH下的绝对路径,每一个路径之间以冒号(:)分割。因此我们输入一个命令后系统就会默认在环境变量PATH下的路径进行一一搜索,如果没有找到就会报command not found

在上面我们提到如果命令能在系统中存在我们就可以不用带路径执行该命令,而环境变量PATH就记录着系统的环境变量的路径,因此只要在环境变量PATH记录的路径上加上我们想要执行的命令的路径是否就意味着我们也可以不带路径执行该命令呢?是的,添加方法如下:

往PATH上添加路径方法:

PATH=$PATH:想要添加的路径

 如上图所示:我们想在PATH变量加上当前路径/home/cwy/cw/linux/lesson13,使用PATH=$PATH:/home/cwy/cw/linux/lesson13命令后我们可以看到环境变量PATH已经加上/home/cwy/cw/linux/lesson13了,执行code -a 也没有报错

微提示:这种方法只是临时的,如果我们将XShell关掉重新启动之后,PATH就会变成之前的 

3.3  env查看所有的环境变量

如上图所示,输入env命令后,系统就会将所有的环境变量打印出来

3.4 环境变量HOME

该变量指向用户的家目录,也就是用户登录系统后默认进入的目录

echo $HOME

3.5 export环境变量设置

如我们想在环境变量中新增一个环境变量MYENV,使用export MYENV=11223344命令后就将MYENV变量添加成功

3.6 unset取消环境变量

如我们想在环境变量中删除环境变量MYENV,使用unset MYENV命令后就将MYENV变量删除成功

 3.7 获取环境变量
3.7.1  方法一:main函数参数法 

 code.c代码:

  1 #include<stdio.h>2 #include<string.h>3 4 int main(int argc,char* argv[],char* env[])5 {6     for(int i = 0;env[i];i++)7     {8         printf("env[%d]-> %s\n",i,env[i]);9     } 10    return 0;11 }

如上图所示:在code.c代码中,我们可以看到main函数参数中有一个字符串数组char* env[],该数组用于存储环境变量,每个元素是一个形如变量名=变量值的字符串,数组以NULL结尾;使用for循环变量env数组,只要env[i]不为NULL就打印当前环境变量的索引和值,如下图所示:

 3.7.2  方法二:系统函数getenv()

在Linux系统里,getenv是一个用于获取环境变量值的函数

函数定义

#include<stdlib.h>

char* getenv(const char* name);

  • 参数:name是一个执行以空字符结尾的字符串指针,代表要获取的环境变量的名称
  • 返回值:若环境变量存在,函数会返回该环境变量值的指针;若环境变量不存在,则返回NULL

code.c代码

  1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 5 int main(int argc,char* argv[],char* env[])6 {   7     8     char* value = getenv("PATH");9     if(value == NULL)10         return 1;11     printf("PATH->%s\n",value);12     return 0;13 }

 如上图所示:我们通过getenv函数来获取PATH环境变量的值,如果PATH不存在为NULL则返回1;反之打印环境变量PATH的内容,如下图所示:

3.7.3 方法三:environ全局变量

在Linux环境里,environ是一个全局变量,能让我们访问进程的环境变量

函数定义:

environ是一个全局变量,定义在<unistd.h>头文件中,其本质是一个字符串指针数组,数组中的每个元素指向一个形如变量名=变量值的字符串,数组以NULL结尾

extern char** environ;

code.c代码:

  1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<unistd.h>5 6 extern char** environ;7 8 int main(int argc,char* argv[],char* env[])9 {   10     11     for(int i = 0;environ[i];i++)12     {   13         printf("environ[%d]-> %s\n",i,environ[i]);14     }15     return 0;16 }

3.8 本地变量

格式:变量=值,等号两边不能带空格

如上图所示:使用i=10,定义了一个值为10 的本地变量并使用echo打印搬到变量i的值

3.9 set显示所有变量

使用set命令可以显示当前XShell的所有变量,包括环境变量,本地变量等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java大厂面试:Java技术栈中的核心知识点

Java技术栈中的核心知识点 第一轮提问&#xff1a;基础概念与原理 技术总监&#xff1a;郑薪苦&#xff0c;你对JVM内存模型了解多少&#xff1f;能简单说说吗&#xff1f;郑薪苦&#xff1a;嗯……我记得JVM有堆、栈、方法区这些区域&#xff0c;堆是存放对象的地方&#xf…

CF1000E We Need More Bosses

CF1000E We Need More Bosses 题目描述 题目大意&#xff1a; 给定一个 n n n 个点 m m m 条边的无向图&#xff0c;保证图连通。找到两个点 s , t s,t s,t&#xff0c;使得 s s s到 t t t必须经过的边最多&#xff08;一条边无论走哪条路线都经过ta&#xff0c;这条边就是…

imx6uLL应用-v4l2

Linux V4L2 视频采集 JPEG 解码 LCD 显示实践 本文记录一个完整的嵌入式视频处理项目&#xff1a;使用 V4L2 接口从摄像头采集 MJPEG 图像&#xff0c;使用 libjpeg 解码为 RGB 格式&#xff0c;并通过 framebuffer 显示在 LCD 屏幕上。适用于使用 ARM Cortex-A 系列开发板进…

强化学习机器人模拟器——QAgent:一个支持多种强化学习算法的 Python 实现

QAgent 是一个灵活的 Python 类,专为实现经典的强化学习(Reinforcement Learning, RL)算法而设计,支持 Q-learning、SARSA 和 SARSA(λ) 三种算法。本篇博客将基于提供的 q_agent.py 代码,详细介绍 QAgent 类的功能、结构和使用方法,帮助您理解其在强化学习任务中的应用,…

Feign的原理

为什么 SpringCloud 中的Feign&#xff0c;可以帮助我们像使用本地接口一样调用远程 HTTP服务&#xff1f; Feign底层是如何实现的&#xff1f;这篇文章&#xff0c;我们一起来聊一聊。 1. Feign 的基本原理 Feign 的核心思想是通过接口和注解定义 HTTP 请求&#xff0c;将接…

探索正态分布:交互式实验带你体验统计之美

探索正态分布&#xff1a;交互式实验带你体验统计之美 正态分布&#xff0c;这条优美的钟形曲线&#xff0c;可以说是统计学中最重要、最无处不在的概率分布。从自然现象&#xff08;如身高、测量误差&#xff09;到金融市场&#xff0c;再到机器学习&#xff0c;它的身影随处…

使用 IDEA + Maven 搭建传统 Spring MVC 项目的详细步骤(非Spring Boot)

搭建Spring MVC项目 第一步&#xff1a;创建Maven项目第二步&#xff1a;配置pom.xml第三步&#xff1a;配置web.xml第四步&#xff1a;创建Spring配置文件第五步&#xff1a;创建控制器第六步&#xff1a;创建JSP视图第七步&#xff1a;配置Tomcat并运行目录结构常见问题解决与…

AI日报 · 2025年5月04日|Hugging Face 启动 MCP 全球创新挑战赛

1、Hugging Face 启动 MCP 全球创新挑战赛 Hugging Face 于 5 月 3 日发布 MCP Global Innovation Challenge&#xff0c;面向全球开发者征集基于模型上下文协议&#xff08;MCP&#xff09;的创新工具与应用&#xff0c;赛事持续至 5 月 31 日&#xff0c;设立多档…

学习spring boot-拦截器Interceptor,过滤器Filter

目录 拦截器Interceptor 过滤器Filter 关于过滤器的前置知识可以参考&#xff1a; 过滤器在springboot项目的应用 一&#xff0c;使用WebfilterServletComponentScan 注解 1 创建过滤器类实现Filter接口 2 在启动类中添加 ServletComponentScan 注解 二&#xff0c;创建…

汇编常用语法

GNU汇编语句&#xff1a; [lable:] instruction [comment] lable 表示标号&#xff0c;表示地址位置&#xff0c;可选. instruction即指令&#xff0c;也就是汇编指令或伪指令。 comment 就是注释内容。 用户使用.section 伪操作来定义一个段&#xff0c;汇编系统预定义了一些…

terraform resource创建了5台阿里云ecs,如要使用terraform删除其中一台主机,如何删除?

在 Terraform 中删除阿里云 5 台 ECS 实例中的某一台&#xff0c;具体操作取决于你创建资源时使用的 多实例管理方式&#xff08;count 或 for_each&#xff09;。以下是详细解决方案&#xff1a; 方法一&#xff1a;使用 for_each&#xff08;推荐&#xff09; 如果创建时使…

pycharm terminal 窗口打不开了

参考添加链接描述powershell.exe改为cmd.exe发现有一个小正方形&#xff0c;最大化可以看见了。

百度「心响」:左手“多智能体”右手“保姆级服务”,C端用户能看懂这技术告白吗?

——当技术名词撞上“傻瓜式”需求&#xff0c;谁是赢家&#xff1f; 「多智能体」是什么&#xff1f;用户&#xff1a;不重要&#xff0c;能一键搞定就行 百度最新推出的多智能体平台“心响”&#xff0c;号称能用自然语言交互一键托管复杂任务。 从旅游攻略到法律咨询&#x…

57认知干货:AI机器人产业

机器人本质上由可移动的方式和可交互万物的机构组成,即适应不同环境下不同场景的情况,机器人能够做到根据需求调整交互机构和移动方式。因此,随着人工智能技术的发展,AI机器人的产业也将在未来逐步从单一任务的执行者,发展为能够完成复杂多样任务的智能体。 在未来的社会…

在两个bean之间进行数据传递的解决方案

简介 在日常开发中&#xff0c;在两个bean之间进行数据传递是常见的操作&#xff0c;例如在日常开发中&#xff0c;将数据从VO类转移到DO类等。在两个bean之间进行数据传递&#xff0c;最常见的解决方案&#xff0c;就是手动复制&#xff0c;但是它比较繁琐&#xff0c;充斥着…

基于开闭原则优化数据库查询语句拼接方法

背景 在开发实践中&#xff0c;曾有同事在实现新功能时&#xff0c;因直接修改一段数据库查询条件拼接方法的代码逻辑&#xff0c;导致生产环境出现故障。 具体来看&#xff0c;该方法通过在函数内部直接编写条件判断语句实现查询拼接&#xff0c;尽管从面向对象设计的开闭原…

QT开发工具对比:Qt Creator、Qt Designer、Qt Design Studio

前端开发工具—Qt Designer Qt Designer是Qt框架的一部分&#xff0c;是一个图形用户界面设计工具。它允许开发者通过可视化方式设计和布局GUI组件&#xff0c;而无需手动编写UI代码。设计完成后&#xff0c;Qt Designer生成UI文件&#xff08;通常以.ui为扩展名&#xff09;&…

0基础 | STM32 | TB6612电机驱动使用

TB6612介绍及使用 单片机通过驱动板连接至电机 原因&#xff1a;单品机I/O口输出电流I小 驱动板&#xff1a;从外部引入高电压&#xff0c;控制电机驱动 电源部分 VM&#xff1a;电机驱动电源输入&#xff0c;输入电压范围建议为3.7&#xff5e;12V GND&#xff1a;逻辑电…

【操作系统】死锁

1. 定义 死锁是指两个或多个进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;因争夺资源而造成的一种僵局&#xff0c;每个进程都无限期地等待其他进程释放它们所持有的资源。在这种情况下&#xff0c;没有任何进程能够继续执行&#xff0c;除非有外部干预。 2. …

C++入门☞关于类的一些特殊知识点

涉及的关于类中的默认成员函数的知识点可以看我的这篇博客哦~ C入门必须知道的知识☞类的默认成员函数&#xff0c;一文讲透运用 目录 初始化列表 类型转换 static成员 友元 内部类 匿名对象 对象拷贝时的一些编译器的优化 初始化列表 我们知道类中的构造函数的任务是完…