进程优先级和环境变量
1.优先级
1.优先级的概念
cpu资源分配的先后顺序,就是指进程的优先级,linux中进程的优先级数字越小,优先级越高;
2.为什么要有优先级
进程访问的资源(cpu)始终是有限的,而系统中进程又是比较多的,所以进程访问要有顺序,优先级高的先调用,
操作系统关于调度和优先级的原则:
分时操作系统,保证基本的公平,每个进程都能被调用,如果进程长时间不被调度,会造成饥饿问题
3.linux优先级的特点和查看方式
ps:用于显示当前系统中进程的状态
PRI:进程优先级
NI:进程优先级的修正数据,nice值,新的优先级=优先级+nice值,达到对进程优先级的动态修改的过程
nice的调整是有限制的,修改范围位[-20,19],而且每次调整优先级,PRI的值都是从80开始的,避免修改叠加
2.命令行参数
1.命令行参数演示
int main(int argc, char *argv[] )
{}
main函数的参数可带可不带,
这些参数的意义:
argc表示命令行传递给程序的参数个数,
argv是一个字符指针数组,argv[0]表示程序的名称,argv[1]表示第一个参数,以此类推,直到最后的NULL,
#include<stdio.h>
int main(int argc,char* argv[])
{
int i=0;
for(i=0;i<argc;i++)
{
printf("argv[%d]->%s \n",i,argv[i]);
}
return 0;
}
2.为什么要有命令行参数
命令行参数本质是交给我们程序的不同选项,用来定制不同的程序功能,命令中会带有很多的选项
命令行中启动的程序,都会变成进程,其实都是bash的子进程,父进程的数据,默认对于子进程是能看到并访问的,但是子进程的后续修改,对于父进程是看不到的,
3.环境变量
1.概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,
比如我们在编写C/C++代码时,在链接时,不知道我们的动态链接库在哪,也能链接成功,原因就是环境变量帮助编译器查找,
比如:PATH环境变量
系统中的很多配置,在我们登录linux系统的时候,就已经被加载到bash进程中(内存),最开始的环境变量在配置文件中,然后被加载到bash中,
2.查看环境变量
env:查看所有环境变量
echo $xxx :查看某个环境变量
export name=value:设置环境变量
unset name:取消设置的环境变量
也可以设置本地变量
name=value 不加export
本地变量只在bash内部有效,不被添加到环境变量中,无法被子进程继承,我们也可以将本地变量导入环境变量中,才可以被子进程获取
export 变量名
我们也可以用代码来查看环境变量
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main()
{
extern char**environ;
int i=0;
for(i=0;environ[i];i++)
{
printf("env[%d]->%s \n",i,environ[i]);
}
return 0;
}
environ是一个字符指针数组,全局变量,用来储存环境变量,每个指针都指向一个以'\0'结尾的字符串,或者给main函数传参也可以
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char*argv[],char*env[])
{
int i=0;
for(i=0;env[i];i++)
{
printf("env[%d]->%s \n",i,env[i]);
}
return 0;
}
bash进程启动时默认会给子进程提供两张表,argv[]命令行参数表,env[]环境变量表,命令行参数表从用户输入命令行提供,环境变量表从操作系统的配置文件提供,
我们还可以通过系统调用函数,来查看环境变量,
getenv()
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("path:%s\n",getenv("PATH"));
return 0;
}
getenv()是一个获取环境变量值的函数,
- 如果找到了指定的
name
环境变量,getenv
函数返回一个指向该环境变量值的指针。 - 如果没有找到该环境变量,函数返回
NULL
。
3.环境变量具有全局属性
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}
当我们直接查看一个不存在的环境变量MYNV。是查不到的,但是我们通过导入环境变量的方式
export MYENV="hello world"
再次运行程序,就可以查到该环境变量了
4.内建命令和普通命令
在linux系统中,命令分为内建命令和普通命令,
内建命令本身是shell的一部分,不是由新的进程调用的,是由shell解释器直接执行,因此不需要创建进程
普通命令是独立的可执行文件,/bin,/usr/bin目录中,这些命令在执行时会创建新的进程