Linux之孤儿进程、进程优先级、环境变量

news2024/11/14 14:57:37

本章目录

  • 1.孤儿进程
  • 2.状态优先级
  • 3.环境变量

1.孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理?
父进程先退出,子进程还在,子进程就称之为“孤儿进程”。

孤儿进程被1号init进程(系统本身)领养,为什么要被领养?未来子进程退出的时候,父进程早已不在,需要领养进程来进行回收。

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main()
  5 {
  6   pid_t id = fork();
  7   if(id == 0)
  8   {
  9     //child
 10     while(1)
 11     {
 12       printf("hello child process\n");
 13       sleep(1);
 14     }
 15   }
 16   else
 17   {
 18     //father
 19     int cnt = 5;
 20     while(cnt)
 21     {
 22       printf("I am father process:%d\n",cnt--);
 23       sleep(1);
 24     }
 25   }
 26   return 0;
 27 }     

此时父进程已经退出,子进程的ppid变成1了。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1 29525 29524 28262 pts/2    28262 S     1001   0:00 ./mytest3

2.状态优先级

基本概念:
CPU资源分配的先后顺序,就是指进程的优先级
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

[jyf@VM-12-14-centos 进程]$ ps -la | head -1 && ps -la | grep mytest4
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  9546 29568  5  80   0 -  1054 n_tty_ pts/3    00:00:06 mytest4

我们可以发现几个很重要的信息:
UID:代表执行者的身份
PRI:代表这个进程可被执行的优先级,其值越小越早被执行
NI:代表这个进程的nice值

PRI and NI
PRI也是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
NI,即我们所要说的nice值了,其表示进程可被执行的优先级的修正数据
PRI值越小越快被执行,那么加入nice值后,将会使的PRI变为:PRI(new) = PRI(old)(指的是每次该PRI,此处的值都是最初的那个,而不是改了的) + nice
这样,当nice值为负数的时候,那么该进程的优先级值将会变小,即其优先级将会变高,则其越快被执行
所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别。

PRI vs NI
需要强调的一点的是,进程的nice值不是进程的优先级,它们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正数据。

如何改进程的nice值,进而改进程的优先级呢?
普通用户改进程优先级,可以输入top命令,回车再输入r,回车在输入进程的pid,回车,在输入nice值,回车,优先级是等于最初的优先级+nice值,如果nice值为负数,即提高进程的优先级,要用sudo或root权限呀。
当然优先级不建议更改,系统自己安排的会更好一些,当然特殊情况除外。

其他概念:
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下采用分别,同时进行运行,这称之为并行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

在这里插入图片描述

3.环境变量

基本概念:
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局属性

常见的环境变量
PATH:指定命令的搜索路径
HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的用户,家目录)
SHELL:当前的shell,它的值通常是/bin/bash。

大家有没有想过这样一个问题,为什么我们自己写到程序运行的时候在当前目录下要带./xxx,即带路径才能运行,而shell的系统命令带不带路径都能运行??
因为系统命令在环境变量的目录中,我们自己的不在,在环境变量中的命令,系统会进行查找识别。

查看环境变量的方法
echo $NAME //NAME:你的环境变量名称

[jyf@VM-12-14-centos 进程]$ echo $PATH  查看环境变量的值的内容
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jyf/.local/bin:/home/jyf/bin

像 ls,pwd等是在/usr/bin目录中的。

比如:我们想自己写到程序运行也像系统命令一样,只需将自己的程序所在的路径加到环境变量中即可。

[jyf@VM-12-14-centos 进程]$ pwd
/home/jyf/进程
[jyf@VM-12-14-centos 进程]$ export PATH=$PATH:/home/jyf/进程(自己程序所在的路径)
[jyf@VM-12-14-centos 进程]$ myproc  //看这样就直接可以运行了
I am parent process:pid :20132
ret:20133,pid:20132,ppid:28262
ret:0,pid:20133,ppid:20132

在命令行上改环境变量,只在本次登陆有效,退出重进后就没了,前提是在没有改配置文件的,改了配置文件是会有影响的
统计自己历史写了多少条目录,上限3000.

[jyf@VM-12-14-centos 进程]$ history | wc -l
788

和环境变量相关的命令
1.echo:显示某个环境变量值
2.export:设置一个新的环境变量
3.env: 显示所有环境变量
4.unset:清除环境变量
5.set:显示本地定义的shell变量和环境变量
我们在shell上单独定义的变量叫做局部变量。

环境变量的组织方式
在这里插入图片描述
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境变量字符串。

通过代码获得环境变量
1.命令行的第三个参数获取

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

2.系统给我们提供的全局变量 extern char** environ;第三方变量获取

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

libc中定义全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。

获得某个环境变量的值:getenv()

int main()
{
printf("%s\n",getenv("PATH"));
return 0;
}

export:

[jyf@VM-12-14-centos 进程]$ export year=2023
[jyf@VM-12-14-centos 进程]$ env | grep year
year=2023

子进程的环境变量是从父进程来到,默认,所有的环境变量,都会被子进程继承,环境变量具有全局属性

[jyf@VM-12-14-centos 进程]$ y=2023  //shell局部变量
[jyf@VM-12-14-centos 进程]$ echo $y
2023

main函数三个参数中前2个参数的意思

main(int argc,char* argv[ ],char* env[ ]);
我们已经知道第三个参数叫做命令行参数,那前两个呢?叫做命令行参数。

> 17 int main(int argc,char* argv[],char* env[])
   18 {
   19   int i=0;
   20   for(i=0;i<argc;i++)
   21   {
   22     printf("argv[%d]:%s\n",i,argv[i]);                                                                                                                                                                     
   23   }                                                                                                                                      
   24   return 0;                                                                                                                              
   25 }  

在这里插入图片描述

 1 #include <stdio.h>
    2 #include <unistd.h>
    3 
W>  4 int main(int argc,char* argv[],char* env[])
    5 {
    6   if(argc==1)
    7   {
    8     printf("Usage:%s 至少要有一个选项\n",argv[0]);
    9     return 1;
   10   }
   11 
E> 12   if(strcmp("-a",argv[1]) == 0)
   13   {
   14     printf("这个是功能一\n");
   15   }
E> 16   else if(strcmp("-b",argv[1]) == 0)
   17   {
   18     printf("这个是功能二\n");                                                                                                                                                                              
   19   }
   20   return 0;
   21 }

结果:

[jyf@VM-12-14-centos 进程]$ ./mytest6
Usage:./mytest6 至少要有一个选项
[jyf@VM-12-14-centos 进程]$ ./mytest6 -a
这个是功能一
[jyf@VM-12-14-centos 进程]$ ./mytest6 -b
这个是功能二

命令行参数的意义:可以让我们同样的一个程序,通过选项的方式,选择使用同一个程序的不同子功能,这就是选项的含义,这些选项的底层都是命令行参数完成的,通过父进程传给子进程的

到这就结束了哦,2023新年快乐!!!

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

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

相关文章

移动安全APT事件总结及防御解决方案探讨

声明 本文是学习移动安全总结 2019. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 2019年各地移动APT事件总结 2019年世界依旧不太平&#xff0c;在表面平静的背后是暗流涌动。大规模军事冲突不会发生的当下&#xff0c;因利益&#xff0c;…

Python全栈开发(一)——环境搭建和入门

今天是2023年的第一天&#xff0c;接下来的一个月里&#xff0c;我将持续更新关于python全栈开发的相关知识&#xff0c;前面一段时间都是基础语法。主要分成四大块&#xff1a;基础、面向对象、MYSQL数据库、Django框架。话不多说&#xff0c;进入到今天的主题。 1.文档和工具…

聊聊最适合程序员的画图工具

画图工具 没问题&#xff0c;直接坦白讲&#xff0c;我用了 2 年的画图工具是&#xff1a;draw.io。 我的图解文章里的图片全是在 draw.io 这个工具画的&#xff0c;写了那么久的图解文章&#xff0c;再加上我工作中也有画图的习惯&#xff0c;累计也有在上面画了接近 1000 张…

树形压缩DP——没有上司的舞会

树形压缩DP——没有上司的舞会一、问题描述二、DFS暴搜1、算法思路2、代码实现三、DP做法一、问题描述 二、DFS暴搜 1、算法思路 这道题其实最容易想到的是暴力DFS&#xff0c;然后选出一个最大值。我们平时会在DFS的形参中设置一个变量表示子树的根。但是今天这道题还涉及到…

mysql的事务和锁

【MySQL事务和锁】 学习原文&#xff1a;https://blog.csdn.net/zly03/article/details/127170995 事务四大特性&#xff1a;原子性、一致性、隔离性、持久性&#xff0c;简称ACID MySQL中支持3种不同的存储引擎&#xff1a; MyISAM存储引擎、Memory存储引擎、和InnoDB存储引…

CMake使用外部动态库/静态库和头文件

CMake使用外部动态库/静态库和头文件一、准备工作二、新建一个新的CMake工程三、开始构建四、为target添加共享库五、链接静态库一、准备工作 在博文《使用CMake构建静态库和动态库》中已经介绍了libhello动态库的构建和安装&#xff0c;现在我们看看如何使用这个外部动态库。…

iOS 15.0+ 中 SwiftUI 顶部或底部悬浮功能小面板的极简实现

功能需求 我们有时需要在 App 主视图的顶部或底部固定悬浮放置一个功能视图: 如上图所示,我们将一个列表项目输入小面板按需放在主视图的顶部或底部: 当放置在顶部时,解决了其对导航栏(NavigationView)中 toolbar 内容的遮挡问题;当放置在底部时,考虑到了其对列表最后…

spring boot 实现搜索引擎的设计思想

目录 实现思路 索引模块 预处理 对文档进行分词 搜索模块 实现思路 索引构建模块 搜索模块 数据库模块 索引模块 对于搜索一个东西&#xff0c;我们很自然的能想到遍历去查找。比如我要查找一本书叫 《红楼梦》&#xff0c;那么我直接在所有结果中进行遍历查找&#xff…

druid解析-过滤器详解

druid支持过滤器&#xff0c;可以在获取连接或者调用连接对象的方法时&#xff0c;先调用过滤器&#xff0c;之后再执行底层方法&#xff0c;比如DruidDataSource的getConnection()方法&#xff1a; public DruidPooledConnection getConnection(long maxWaitMillis) throws SQ…

网络安全一哥的奇安信发布了全球高级可持续威胁年度报告 值得学习

声明 本文是学习全球高级持续性威胁 APT 2021年度报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 中国境内高级持续性威胁综述 基于中国境内海量DNS域名解析和奇安信威胁情报中心失陷检测&#xff08;IOC&#xff09;库的碰撞分析&…

9_1、Java基本语法之常用类String、StringBuffer、StringBuilder的使用

一、String的使用及常用方法 1、概述 String:表示字符串&#xff0c;使用""引起来。 1.1、String类是声明为final的&#xff0c;不可被继承。 1.2、String类实现了Serializable接口&#xff0c;表示字符串支持序列化。 …

【王道操作系统】2.1.3 原语实现对进程的控制

原语实现对进程的控制 文章目录原语实现对进程的控制1.什么是进程控制2.原语实现对进程的控制3.回忆进程的组织4.进程控制大致图解5.进程控制原语的相同点6.进程控制的五种原语1.什么是进程控制 2.原语实现对进程的控制 3.回忆进程的组织 4.进程控制大致图解 这里说明一下调度和…

MySQL【AUTO_INCREMENT 】自增列

使用案例场景再现&#xff1a; 创建一个为test的数据库&#xff0c;为数据库test创建一个数据表student &#xff0c;其中包含的字段有 id name sex&#xff0c;admission_time,其中要求student表中的人员id必须连续排列。 create database test use test cr…

SCI论文解读复现【NO.1】基于Transformer-YOLOv5的侧扫声纳图像水下海洋目标实时检测

此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;帮助…

三旗舰焕新发布引领品牌向上 长城汽车登陆2022广州车展

近日&#xff0c;长城汽车携哈弗、魏牌、欧拉、坦克、长城炮以及沙龙六大品牌&#xff0c;登陆第二十届广州国际汽车展览会&#xff08;以下简称“2022广州车展”&#xff09;。魏牌全新旗舰蓝山DHT-PHEV、坦克500 PHEV长续航版、大型高性能豪华皮卡山海炮等车型联袂而至&#…

创建静态库存文件 ansible(3)

目录 创建一个名为/home/student/ansible/inventory的静态库存文件如下所示&#xff1a; &#xff08;1&#xff09;node1是dev主机组的成员 &#xff08;2&#xff09;node2是test主机组的成员 &#xff08;3&#xff09;node1和node2是prod主机组的成员 &#xff08;4&am…

【Qt】控件——QPlainTextEdit使用简单介绍:常用方法及信号、逐行读取编辑框的内容、使用自带的快捷菜单、作为日志显示窗口

Qt控件-QPlainTextEdit使用 参考链接&#xff1a; https://blog.csdn.net/seniorwizard/article/details/109726147; https://blog.csdn.net/seniorwizard/article/details/109726147 文章目录Qt控件-QPlainTextEdit使用QPlainTextEdit控件简单介绍1. 逐行读取文本编辑框的内容…

【PCB专题】什么是金属化孔(PTH)和非金属化孔(NPTH)

计出来的,并不是放在那里好看的,每个不同的孔洞都有其目的。一般来说孔洞越多,PCB的成本也越高。 PCB中的孔类型大体上可以被区分为PTH(Plating Through Hole)电镀导通孔,和NPTH(None Plating Through Hole)非电镀导通孔两大类。这里说的通孔是指从PCB的一面直接贯穿到…

Spark数据倾斜性能调优

目录 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 某个task执行特别慢的情况 某个task莫名其妙内存溢出的情况 查看导致数据倾斜的key的数据分布情况 知识拓展 coalesce 和 repartition 的区别 数据倾斜的解决方案 解决方案一&am…

【哈工大大一年度项目经验与感想】立项篇 中(2021.9.17~2021.11.17)

第四步&#xff1a;立项报告书写 立项报告的目的在于向答辩老师或者投资方阐述你的项目是什么&#xff1f;做什么的&#xff1f;解决什么问题&#xff1f;打算怎么解决这些问题&#xff1f;有什么创新点、特色&#xff1f;目标&#xff1f;所以一篇立项报告正文需要包括以下内容…