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

深圳seo网站建设郑州网站推广公司

深圳seo网站建设,郑州网站推广公司,有哪些网站可以接单做效果图,阿里巴巴1688网页版Linux环境变量孤儿进程进程优先级其他概念环境变量感性的理解环境变量常见的环境变量添加环境变量环境变量的组织形式通过代码如何获取环境变量再次理解环境变量命令行参数孤儿进程 概念:父进程先于子进程结束,这样的子进程就叫做“孤儿进程”; “孤儿”…

Linux环境变量

  • 孤儿进程
  • 进程优先级
  • 其他概念
  • 环境变量
    • 感性的理解环境变量
    • 常见的环境变量
    • 添加环境变量
    • 环境变量的组织形式
    • 通过代码如何获取环境变量
    • 再次理解环境变量
  • 命令行参数

孤儿进程

概念:父进程先于子进程结束,这样的子进程就叫做“孤儿进程”;

“孤儿”进程,真的就没有了父进程了吗?
答案是当然不是,当子进程原先的父进程先子进程一步“去”过后,会由os启动领养程序,该子进程会被init进程(也就是os)领养,此时init进程就是子进程的父进程;

那么为什么孤儿进程需要被init领养呢?
回答这个问题,也就是回答,如果不领养孤儿进程会怎么样?
如果没有进程领养孤儿进程的话,在孤儿进程结束后,由于没有父进程接受它的状态码,也就是没有父进程对其所占的空间进行回收,孤儿进程就会一直处于“僵尸”状态,白白的浪费内存,造成内存泄漏,为此为了回收孤儿进程结束过后的空间,os就安排自己充当了孤儿进程的父进程;
下面我们通过一段代码,来演示孤儿进程:

   #include<stdio.h>                                                                                                                                                                                             #include<unistd.h>int main(){pid_t id=fork();if(id==0){//childwhile(1){printf("我是子进程,我的pid:%d,我的ppid:%d\n",getpid(),getppid());sleep(1);}}else if(id>0){//fatherint sec=10;while(sec){printf("我是父进程,我的pid:%d,我的ppid:%d,我还有%ds死去!\n",getpid(),getppid(),sec--);sleep(1);}}else{printf("error!\n");}return 0;}

我们可以通过利用ps -axj命令来查看我们进程的pid和ppid:
在这里插入图片描述
此时子进程由原来的前台程序,变为了后台程序,我们可以通过ps命令输出的STAT哪一项来判断,状态带+号的就是前台程序,不带+号的就是后台程序;我们利用Ctrl+c的快捷键杀不死后台程序,但是我们可以利用命令kill -9 pid或者killall 进程名这两个命令来杀死进程;
在这里插入图片描述

进程优先级

什么是进程优先级:就是那个进程先执行,那么进程后执行;

为什么会有进程优先级?
因为CPU资源有限,为了使每个进程都合理的使用到CPU资源;

怎么使用优先级?
首先我们可以通过命令:ps -al来查看:
在这里插入图片描述
其中修改优先级的公式:PRI=PRI(默认值)+nice;
nice的取值范围:[-20,19];
nice值为什么是这个区间,因为一个进程的优先级必须有个度,不能过高也不能过低,过高或过低都会严重造成CPU资源的分配不合理;
如何修改优先级?
我们可以输入top命令->输入r->输入进程pid->输入nice值;
一般情况下,我们普通用户只能把优先级变大,不能把优先级变小,如果想要变小优先级,我们可以切换成root:
在这里插入图片描述
如果想要变小优先级的话,需要切换成root,因为普通用户权限不够;

其他概念

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

环境变量

概念:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
说实话,这官方的概念,我们初学者理解起来比较困难;我来说说我对于这句话的理解吧:
我认为环境变量就是指定os在一些特定情况下该做什么的动态参数;
就比如:os应该把临时文件放在哪里?当我们运行一个程序时,并没有指定该程序的位置时,os应该去哪里寻找这个程序?在我们需要读取当前机器的用户名时,os应该去哪里拿?
我们可以通过设置环境变量,来告诉os,遇到这些情况时,应该去哪里寻找“答案”;

感性的理解环境变量

或许上面的一通概念,并没有让我们理解什么是环境变量,下面我们通过一个例子来更好的理解环境变量:

在Linux环境下,为什么在运行我们自己的可执行程序时需要带上./这样的相对路径,或者绝对路径?而在运行诸如:ls、cd、tree、cp等命令时不需要带上它们的路径?我们可不可以让自己的程序也能不带上路径就运行起来呢?
首先当我们在运行一个不带任何路径的程序时,os会去PATH环境变量下,寻找是否含有当前程序,找到了就执行,找不到就报错!而对于我们指定路径的程序,则去指定路径下搜索!
那么PATH环境变量里面到底装的是什么?
我们可以通过命令:echo $PATH来查看PATH环境变量下的内容:
在这里插入图片描述
我们可以发现PATH里面都是一些路径,这些路径以:作为分隔!
那么我们如何让我们自己的程序像ls等命令一样不用指定路径也能直接使用呢?
如果我们想要想要像:ls、pwd、tree等命令一样使用起来不带路径的话,我么只需要将我们的可执行程序添加到PTAH中任一一条目录下或者将我们的路径追加到PATH环境变量下面;
首先我们来实验一下第一种办法:
1、将我们的可执行程序添加到PATH环境变量下的任意一路径中去,比如我们可以将我们都程序添加到PATH下的/usr/bin/目录下去:
在这里插入图片描述
当然如果我们还是按照原来的方式./Code2-22来运行程序也是可以的:
在这里插入图片描述
2、直接将我们当前目录添加到PATH环境变量中去:
首先我们先来演示一种错误的添加方式:
PATH=路径
在这里插入图片描述
向上面这种添加方法,虽然我们的程序可以不带路径运行了,但是像ls这些命令就不能运行了,想要运行他们必须带上路径了:
在这里插入图片描述
可这终归不是万全之策,在后续的使用上极其不方便!这里主要有两个解决办法:
1、将原来PATH默认的路径重新赋值给PATH
2、重新登录shell就可以了;

既然上面的那种赋值方式不是正确的方式,那么该如何向PATH环境变量里面追加路径呢?
PATH=$PATH:路径
在这里插入图片描述
像这样,过后我们不仅可以不带路径的使用我们追加的路径下的可执行程序,同时也不会影响ls等命令的使用:
在这里插入图片描述

常见的环境变量

通过上面的例子我们对于环境变量有了一定的理解,接下来我们来看一看一些比较常见的环境变量:

PATH : 指定命令的搜索路径;
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
在这里插入图片描述
SHELL : 当前Shell,它的值通常是/bin/bash。
在这里插入图片描述
USER:当前登录机器的用户;
在这里插入图片描述
PWD:当前所在目录;
在这里插入图片描述
当然这都是一些比较常见的环境变量,我们如果想要查看所有环境变量的话,我们可以使用命令env
在这里插入图片描述

添加环境变量

那么如何添加环境变量?
我们可以通过命令export 环境变量我们也可以给这个环境变量赋值export 环境变量=100
在这里插入图片描述

环境变量的组织形式

首先我们知道环境变量是存储的有内容的,那么这些环境变量里面的内容是从哪里来的?
答:环境变量的内容一般是由os从特定的配置文件中读取到的,当我们的os启动完毕过后,os就会读取相关配置文件里面的数据放到环境变量里面;在Linux下环境变量一般都在家目录下的.bashrc和.bash_profile;
这些环境变量也是数据,os也会对这些数据进行管理,os利用一个字符指针数组来维护这个环境变量表
在这里插入图片描述
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串;
这个环境变量表的最后一个元素是NULL,以此来表示环境表的长度;

通过代码如何获取环境变量

通过代码环境变量主要有3种方式:

1、通过main函数的参数获取;
我们都知道main函数是可以带参数的,而且最多可以带3个参数,比如:
int main(int argc,char*argv[],char*envp[]);
其中envp就是指向这个环境表的首元素指针,通过envp我们可以获取到环境变量:
下面我们通过代码测试:
在这里插入图片描述在这里插入图片描述
2、我们也可以不用main的参数,C语言给我们提供了一个全局的字符指针,用来指向环境表,我们也可以通过这个全局的环境表来访问环境变量,这个全局的字符指针也就是:environ,我们只需要声明一下即可使用:
在这里插入图片描述
在这里插入图片描述
3、通过getenv函数来获取;
上面的两种方法虽然可行,但是用起来实在是不方便,比如我向访问一下USER这个环境变量,还得我自己去写匹配算法去一个一个寻找,很是麻烦,而是用getenv函数则会省去我们自己写匹配算法查找的过程,我们只需要告诉getenv我们需要获取哪个环境变量即可,getenv就会返回对应环境变量的内容;如果没有找到对应环境变量则返回NULL;
在这里插入图片描述
接着我们利用getenv来测试一下:
在这里插入图片描述
在这里插入图片描述
的确是这样的,为此我们可以利用该函数实现一个只允许ikun使用的pwd命令!
测试代码:
在这里插入图片描述
为了保持我们的pwd指令能像系统的pwd指令那样执行,我们需要将我们的代码所形成的可执行程序添加到PATH其中一个默认目录下:
在这里插入图片描述
接着我们来使用一下自己的pwd:
在这里插入图片描述

再次理解环境变量

环境变量就是内存级的一张环境变量表,这张表由用户登录的时候,os根据用户形成用户自己环境变量表;每个用户的环境变量表都不一样!
环境变量表中的每个元素都有自己的作用和应用场景,有的是用来进行查看当前用户名的,有的是用来进行用户查找的,有的用来记录当前路径的等等……
每一个环境变量都有自己的应用场景;

那么如何理解环境变量是一张内存级的表呢?
你说一个int a=10;double b=20;这样的a、b变量我能理解,那么环境变量为什么说是内存级?
在os启动的时候,os会启动shell程序,然后将自己读取到的环境变量交给shell,当我们在命令行输入export MYPATH=1000,shell会认为你是在定义一个新的环境变量,然后shell就会去内存找块空间将"MYPATH=1000"这个字符串存起来(或者malloc一块空间),让后将该空间的指针添加到环境变量表里面!这样就完成了新增环境变量!环境变量是可以被子进程继承下去的,而我们启动的程序都是shell的子进程,因此我们的进程是可以拿到shell维护的环境变量表的!
同时我们需要注意一下,export定义的环境变量具有全局性,也就是export定义的环境变量是会进入环境变量表的,也就可以被所有子进程访问,但是没有用export定义的环境变量,是不具有全局性的,这种环境变量不会进入环境表,自然也就无法被子进程访问,只能在Shell本身进程访问!
比如我们现在创建一个本地的环境变量:我们的子进程是访问不到的:
在这里插入图片描述

我们再来通过我们的程序获取该变量:
在这里插入图片描述
在这里插入图片描述
我们的Code2-22作为shell的子进程并没有在从shell上继承下来的环境表中访问到MYPATH
同时我们也可以通过命令env来验证,该命令env只会显示出全局的环境变量,对于本地环境变量不显示:
在这里插入图片描述
我们发现依旧没有结果;
当时我们用set命令来找到我们设置的本地环境变量,set命令会显示出全局的和本地的环境变量;在这里插入图片描述
如果我们想要清除环境变量的值可以用unset命令:在这里插入图片描述

命令行参数

上面我们再介绍利用代码获取环境变量的时候,提到了可以利用main函数的参数来获取,其中我们介绍了envp参数,但是argc、argv参数没怎么讲,现在我们就来理解一下这两个参数的意义;
int main(int argc,char*argv[],char*envp[]),从结构上我们可以看到argv与envp是同一个类型,于是我们可以大胆的猜测一下,argv也可能表示的是一张表!其中argc是这个表的长度!
那么这个表里面有什么呢?我们可以打印出来看看:
在这里插入图片描述
在这里插入图片描述
我们可以发现argv似乎输出的是们在命令行输入的指令,我们命令行输入的什么,argv就输出什么;
我们现在来剖析一下我们在命令行输入的东西:
在这里插入图片描述
你看这和我们ls -a -l 的形式是不是一样的,实际上我们在命令行指令+选项的方式时,shell会读取到这一串字符串,然后以空格作为间隔,将指令和选项存在一张表里面,当Shell为我们的指令创建进程的时候就会将这张表传给子进程!子进程就可以根据选项表现出不同的功能;
在这里插入图片描述
因此argv的作用就是可以让我们的程序根据不同的选项执行不同的功能!

http://www.dinnco.com/news/28523.html

相关文章:

  • 学校网站的图片轮播怎么做自然搜索优化
  • 公司网站 优帮云腾讯云服务器
  • 成都正规小程序开发公司百度移动端优化
  • 企业网站建设需要哪些步骤网络销售
  • 网站如何做百度搜索优化网站自助建站系统
  • 北京微网站宁波做网站的公司
  • 临海市住房与城乡建设规划局网站手机优化软件下载
  • 开发一个交友app多少钱优化seo可以从以下几个方面进行
  • 网站备案要幕布照怎么让百度收录
  • 网站做淘客seo点击
  • 湖北外贸网站设计制作怎么制作公司网站
  • 装饰公司网站上海网络seo公司
  • 网页一键生成小程序江苏网站seo设计
  • 金华网站建设黄页网络推广是什么职业
  • 哪里医院做无痛人流便宜 咨询网站在线品牌推广策略包括哪些内容
  • 网站建设需求培训心得体会范文
  • 网站链接可以自己做吗百度链接提交
  • 网站加载流量网络推销平台有哪些
  • 给一个网站做需求分析市场调研与分析
  • 腾达企业交换机管理网站东莞网站建设快速排名
  • 一个企业做网站推广的优势搜索引擎营销的方法有哪些
  • 网站经常出现502seo如何优化
  • 网站by wordpress百度一下打开
  • 做家教网站外包公司为什么没人去
  • wordpress搭建淘客网站西安seo外包服务
  • wordpress后台目录无法访问徐州新站百度快照优化
  • 网站建设跟网站开发有什么区别吗企业营销推广怎么做
  • 重庆专业网站开发服务简述网络营销的特点
  • 怎么用wordpress做网盘seo的主要内容
  • 怎么给别人做网站媒体软文发稿