【Linux】环境变量与进程优先级
创始人
2024-05-26 16:08:58
0

文章目录

  • 🎪 进程优先级
    • 🚀1.孤儿进程
    • 🚀2.优先级查看
    • 🚀3.优先级修改
  • 🎪 环境变量
    • 🚀1.常见环境变量
    • 🚀2.环境变量获取
    • 🚀3.main中的命令行参数


🎪 进程优先级

每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。最终的优先级共 32 级,是从 0 到 31 的数值,称为基本优先级别(Base Priority
Level)。

🚀1.孤儿进程

在父子进程的问题中,父进程如果比子进程先退出,那么子进程退出后将进入Z状态,那么它的资源又该由谁来回收呢?如果没有了父进程,子进程退出一直卡在僵尸状态会造成内存泄露。那么OS该怎么处理呢?

myproc.c

#include 
#include int main()
{pid_t id = fork();if (id == 0){while (1){printf("我是子进程:pid:%d,ppid:%d\n", getpid(), getppid());sleep(1);}}else{int cnt = 10;while (1){printf("我是父进程:pid:%d,ppid: %d\n", getpid(), getppid());sleep(1);if (cnt-- <= 0) break;}}return 0;
}

Makefile

myproc:myproc.cgcc -o $@ $^
.PHONY:clean
clean:rm -f myproc

这里我们运行myproc后10s后父进程会自动退出,这里我们用shell脚本语言便于观察一下子进程的情况:

while :; do ps ajx | head -1 && ps -ajx | grep myproc | grep -v grep; sleep 1; echo "-----------"; done

在这里插入图片描述
我们发现父进程运行结束后并没有进入僵尸状态,而是被它的父进程bash回收了,而子进程的父进程变成了1, 这个PID为1的就是操作系统本身,也就是说父进程退出后,子进程会被OS自动领养称为后台进程——即孤儿进程

🚀2.优先级查看

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice(修正)值

在这里插入图片描述
我们创建进程默认优先级是80,区间是[60,99].默认修正值是0,区间是[-20,19],其中当前优先级 = 默认优先级 - nice值:即PRI(new)=PRI(old)+nice

🚀3.优先级修改

当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行,所以,调整进程优先级,在Linux下,就是调整进程nice值

命令:top + r + PID + NI
功能:调整进程NI值(root下)

调整进程4193优先级为85,即修改nice值为5.
在这里插入图片描述
在这里插入图片描述

🎪 环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

  • 按生命周期分:
    永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
    临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
  • 按作用域分:
    系统环境变量:公共的,对全部的用户都生效。
    用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。
    在这里插入图片描述

🚀1.常见环境变量

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

命令:echo $NAME
功能:查看环境变量内容

我们可以观察到PATH环境变量内容如下:此路径代表各个命令的搜索路径。

在这里插入图片描述
我们之前说过Linux的基本命令本质上也是一个可执行程序,跟我们自己的程序本质上是一样的,那么我们自己的程序为什么要带./才能执行呢,不能像指令一样直接运行吗?当然可以,我们将它添加进系统的环境变量中即可.

pro2.c

#include 
#include int main()
{printf("hello world\n");printf("hello world\n");printf("hello world\n");printf("hello world\n");printf("hello world\n");return 0;
}

我们将该程序对应的路径添加进PATH环境变量里边,即export $PATH = /home/ljk/linux/107c++work/work10
在这里插入图片描述
添加进去后,我们的程序确实可以向指令一样运行了,但是在PTAH路径下的指令都找不到路径无法运行了,我们相当于直接把系统路径替换了成了我们的路径,那怎么办呢?我们只需要把我们的OS重启即可恢复正常.我们要的是追加而不是替换。

执行命令:export PATH=$PATH:/home/ljk/linux/107c++work/work10

在这里插入图片描述
此时便完成了我们路径的追加.

除了添加环境变量,我们还可以直接添加程序到路径/user/bin/目录下也可以把我们自己的程序当命令来执行

在这里插入图片描述

🚀2.环境变量获取

环境变量相关指令:

  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

我们可以使用env命令来查看当前进程的环境变量:

在这里插入图片描述

在最新的C99标准中,入口函数main函数还可以这样定义:

int main( int argc, char *argv[], char* envp[]) /* 带参数形式 */{...return 0;}

envp数组是一个字符指针的数组,这个数组的每一个元素是指向一个环境变量的字符指针。我们就可以通过遍历envp数组来实现对进程环境变量的获取:

pro3.c

#include 
#include int main(int argc, char* argv[], char* envp[])
{int i = 0;for (i = 0; envp[i]; i++){printf("envp[%d]->%s\n", i, envp[i]);}return 0;
}

在这里插入图片描述
除了通过命令行参数获取,我们还可以通过第三方变量environ获取

pro4.c

#include int main(int argc, char* argv[])
{extern char** environ;int i = 0;for (; environ[i]; i++){printf("environ[%d] -> %s\n", i, environ[i]);}return 0;
}

在这里插入图片描述

我们可以用以上方法获取环境变量,但是不推荐,因为使用场景不符合实际情况,我们通常会获取单一环境变量,我们可以用函数getenv("NAME")获取我们需要的环境变量.我们先来查一下该函数:
在这里插入图片描述
该函数需要传入参数环境变量名,返回值是环境变量内容

pro5.c

#include 
#include 
#include int main()
{char* pwd = getenv("PWD");if (pwd == NULL) perror("getenv");else printf("PWD: %s\n", pwd);char* user = getenv("USER");if (user == NULL) perror("getenv");else printf("USER: %s\n", user);return 0;
}

在这里插入图片描述

注意:

  • 环境变量本质上就是内存级的一张表,这张表在用户登录系统的时候,进行给特定用户形成属于自己的环境变量表
  • 环境变量中的每一个,都有自己的用途:有的进行路径查找,有的进行身份认证,有的进行动态库查找,有的用来确认当前路径
  • 每个环境变量都有自己的应用场景,且每个元素都是k-v映射的

我们的envp数组实际上就是存放的环境变量表的内容,environ变量也是,而函数getenv()也是在环境变量表中查找的.

除此之外,我们还可以利用环境变量为自己的程序设置权限:

pro6.c

#include 
#include 
#include int main()
{char* user = getenv("USER");if (strcmp(user, "ljk") == 0){printf("程序已执行...\n");}else{printf("执行错误,当前用户 %s 为非法用户\n", user);}return 0;
}

在这里插入图片描述

环境变量通常具有全局属性,可以被相关的子进程继承,我们自己导入的环境变量也是如此:

pro7.c

#include 
#include int main()
{char* myenv = getenv("Myenv");if (myenv != NULL){printf("Myenv: %s\n", myenv);}return 0;
}

我们运行后发现未找到环境变量,我们再继续执行export Myenv=“hello world”,这时在运行程序,发现可以找到该环境变量:

在这里插入图片描述

说明:环境变量具有全局性,是可以被子进程继承的

🚀3.main中的命令行参数

我们讨论了main函数中的第三个参数,前两个参数是啥呢?

  • argc表示数组argv元素个数
  • argv表示命令行参数,需要我们自己传入

pro8.c

#include int main(int argc, int* argv[])
{for (int i = 0; i < argc; i++){printf("argv[%d]->%s\n", i, argv[i]);}return 0;
}

在这里插入图片描述
我们就可以用条件判断传入的参数,从而实现不同的功能。

pro9.c

#include 
#include 
#include 
#include void Usage(const char *name)
{printf("\nUsage: %s -[a|b|c]\n\n", name);exit(0);
}
int main(int argc, int* argv[])
{if (argc != 2) Usage(argv[0]);if (strcmp(argv[1], "-a") == 0) printf("打印当前目录下的文件名\n");else if (strcmp(argv[1], "-b") == 0) printf("打印当前目录下文件的详细信息\n");else if (strcmp(argv[1], "-c") == 0) printf("打印当前目录下的文件名(含隐藏文件)\n");else printf("其它功能,敬请期待\n");}

在这里插入图片描述
这种通过选项来改变输出内容是不是很熟悉,没错,我们的命令后面带的选项本质上也是传入的命令行参数实现不同的功能

相关内容

热门资讯

秤人添岁立夏忙,青瓷蛋雕绘新光 转自:上观新闻原标题:《【AI绘·二十四节气中的非遗】秤人添岁立夏忙,青瓷蛋雕绘新光》栏目主编:张陌...
乘船时要注意哪些事项?意外落水... 来源:央视新闻客户端 2025年05月04日下午,贵州省黔西市新仁苗族乡六冲河东风库区附近发生载人游...
工业和信息化部:加强通用大模型... 来源:新华社  记者近日从工业和信息化部获悉,下一步将加强通用大模型和行业大模型研发布局,加快建设工...
小观看天丨山洪+地灾预警,返程... 气象万千,小观看天!小伙伴们,早上好!今天是5月5日,星期一。今天迎来立夏节气,也是“五一”假期最后...
两人被捕 事故最终原因仍在确认... 当地时间5月4日,伊朗沙希德拉贾伊港口事故调查委员会公布了最新事故调查报告。报告指出,根据此前的初步...
市场消息:特朗普官员正探索挑战...   据报道,美国总统特朗普政府的官员正在探索挑战非营利组织免税地位的方法。媒体援引熟悉内情的人士的话...
反导系统未能拦截胡塞武装导弹,... 当地时间5月4日,以色列空军对当天胡塞武装向本-古里安机场发射导弹一事进行了调查,初步结果显示拦截失...
立夏节气预警大数据报告:雷电预... 今天(5月5日),我国进入夏季的第一个节气——立夏。这个时节,象征着春天的告别与夏日的开启,气温逐步...
加开列车! 转自:西安发布今天是2025年5月5日星期一(农历四月初八)今日立夏天气预报5日:多云,有浮尘或扬沙...
伊利集团张轶鹏:品质是伊利的最...   由Hehson财经主办的“第十届巴菲特股东大会中美投资人酒会”于美国当地时间5月3日在美国内布拉...
伊利集团张轶鹏:近两年乳企普遍...   由Hehson财经主办的“第十届巴菲特股东大会中美投资人酒会”于美国当地时间5月3日在美国内布拉...
迎难而上再捧苏杯 国羽展现强大... 转自:中国体育报5月4日,在厦门奥林匹克体育中心凤凰体育馆,中国羽毛球队如愿第14次捧起苏迪曼杯,大...
投资前瞻:周四聚焦美联储议息结...   来源:Wind万得  // 市场要闻 //  1、重磅宏观数据公布  5月7日,国家统计局将发...
今日立夏!风暖昼长,万物逐渐繁... 转自:北京日报客户端来源:北京日报客户端记者:胡德成流程编辑:U072
刘文萍到巨鹿县、隆尧县调研检查 转自:邢台网加快高端化智能化绿色化转型 持续塑造产业集群新动能新优势本报讯(记者谢霄凌 通讯员杨佳希...
俄称打击乌多目标,乌称袭击俄防... 俄罗斯国防部5月4日通报称,过去一天,俄军在苏梅、哈尔科夫、顿涅茨克、扎波罗热、赫尔松等方向打击乌军...
华安基金十年老将李欣离职!曾创...   又有资深基金经理官宣离职。  近日,华安基金发布公告,基金经理李欣因个人原因即将离任,新任基金经...
迎难而上再捧苏杯 国羽展现强... 5月4日,在厦门奥林匹克体育中心凤凰体育馆,中国羽毛球队如愿第14次捧起苏迪曼杯,大家激情庆祝这来之...
中国金茂,营收大增、利润下滑,...   来源:基本面力场  中国金茂(0817.HK)是力场君一只在关注的一只房地产股,也是力场君最喜欢...
河北滦平:雨后清晨金山岭长城云... 转自:北京日报客户端5月5日立夏节气,河北省承德市滦平县金山岭长城,迎来降雨天气。雨后清晨,云雾缭绕...