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

安装好了wordpressseo外链推广

安装好了wordpress,seo外链推广,建设项目竣工验收公示网站,运城盐湖区姚孟信通网站开发中心目录 前言: 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言: 通过上文的学习,我们了解了进程终止,知道终止是在干什么,终止的三种情况,以及有了退出码,错误码的概念&#xff…

目录

前言:

进程等待是什么

为什么需要进程等待

进程等待都在做什么


前言:

通过上文的学习,我们了解了进程终止,知道终止是在干什么,终止的三种情况,以及有了退出码,错误码的概念,对于错误码,我们知道不同的人对于错误码有自己的一套体系,对于退出码,我们知道可以使用echo $?来查看,并且知道了如果终止进程。

那么本文,我们来学习进程等待,我们从三个方面来看,进程等待是什么?为什么要等待?等待是在做什么?从以上几个方面,相信同学对于Linux中的进程等待有更深层次的理解。


进程等待是什么

思考:什么情况下会发生等待的情况?

情况实例:父进程创建了子进程,父进程任务结束,子进程还没有结束,父进程需要等待子进程退出。这种情况就是等待。

那么不等待会引发的后果是什么呢?

如果父进程不等待,直接退出,那么子进程会变成僵尸进程,僵尸进程导致的问题有内存泄漏,其中内存泄漏是一个很危险的问题,所以进程一般情况下,父进程都是要等待退出的。

拿bash再举一个例子,如果我们执行的所有指令,所有可执行文件bash都不回收,那么内存就是一次性的,我们的机器也用不了多久就会报废了。

所以我们得出结论:

进程等待是父进程比子进程先结束自己的任务,所以父进程为了 整个系统的稳定性,需要等待子进程。

为什么需要进程等待

进程等待除了考虑内存泄漏引发的安全问题,父进程还需要考虑获取子进程的退出信息,这是一个可选的选项,因为不是所有的子进程都需要父进程获取退出信息。

进程等待都在做什么

前面两点,即便是没有学习过进程等待的都应该知道有那么回事,今天的重点实际上是在等待子进程的时候父进程是在做什么。

那么为了介绍父进程等待的时候在做什么,我们不妨从一个函数开始->waitpid:

从man 2号手册我们可以看到,waitpid的头文件是sys/types.h sys/wait.h,其实到现在一个函数需要两个头文件我们也见怪不怪了,比如fork函数,除了types还需要的头文件是unistd,这也可以说是一种学习的里程碑吧!

那么参数方面,一共有三个:

pid_t waitpid(pid_t pid, int *wstatus, int options);

一个pid,一个是输出型参数,一个是对应的选项。

三个参数的理解为,pid就是父进程要等待的子进程的pid,毕竟一个父进程可能创建多个子进程,要等待谁呢?得指定吧。第二个参数是输出型参数,可能直接这么说我们不好理解,看这段代码就知道了:

int a = 0;
scanf("%d",&a);

scanf的参数就是输出型参数,即不是给OS的,是给用户看的。第三个参数就像ls -a -l -n,这么多选项一样。

这里还有一个点,pid的参数如果我们给-1会怎么样呢?->等待的就是任意进程了

对于返回值来说,我们简单先理解为如果等待成功,返回的就是子进程的pid,否则就是返回-1:

代码为:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <stdlib.h>void ChildRun()
{//int *p = NULL;int cnt = 5;while(cnt){printf("I am child process, pid: %d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);sleep(1);cnt--;//*p = 100;}
}int main()
{
printf("I am father, pid: %d, ppid:%d\n", getpid(), getppid());pid_t id = fork();if(id == 0){// childChildRun();printf("child quit ...\n");exit(123);}sleep(7);// fahter//pid_t rid = wait(NULL);int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid > 0){printf("wait success, rid: %d\n", rid);}else{printf("wait failed !\n");}sleep(3);printf("father quit, status: %d, child quit code : %d, child quit signal: %d\n", status, (status>>8)&0xFF, status & 0x7F);return 0;
}

当然了,对于waitpid我们应该先了解一下wait:

wait其实就一个输出型参数,所以,,如果输出型参数设置为NULL,就是代表不关心这个子进程,也就没了,所以我们了解了waitpid之后,自然就了解了wait。waitpid的参数设置为-1也就和wait等效了。

对于正常来说,子进程进入了一个函数,通过cnt进行计时,5秒之后,子进程结束了,变成了僵尸,父进程还没有结束,父进程sleep一过开始回收,此时就回收成功:

我们通过指令:

 while :; do ps -xaj | head -1 && ps -xaj | grep main | grep -v grep; sleep 1;done

就可以亲眼看到了进程从僵尸状态变成了正常状态了。

此时,细心的同学发现了最后打印的时候,打印了子进程的退出码,以及一个信号码:

那么因为这里都是正常退出的,所以退出码我们自己设置的是123,所以打印出来也是123,至于有什么含义呢,我们自己规定即可。对于信号码来说,我们需要了解一个点:

退出信息的本质是什么?

退出信息本质上是一块有16bit位的空间,0 - 7bit位代表的是信号,8 - 15bit位代表的是退出码,退出信息实际上等于退出码 + 信号码,退出信息里面的core dump我们暂且不考虑,我们需要知道退出码从哪里看?

你看代码,代码打印退出码,打印信息码的时候,我们是不是通过按位与操作获取了某个特定区域的bit位并且打印出来了。那个操作实际上就是代表的取退出码和取信号码。

那么你是否会觉得退出码和信号码为什么只需要这么多个?

我们可以看:

拿信号举例,一共就那么多,7个bit位还多了呢,退出码同理可得即可。

那么这里我们注意一下,11号信号是段错误,我们如果让子进程发生越界访问:

也就是这里让空指针修改一下:

可以看到退出码为0,可是我们知道如果发生了越界,进程终止实际上是被信号所杀,退出码实际上是没有用处的,这里的信号码为11,我们就知道了,是OS给子进程发送了11号信号,从而导致了子进程终止,但是父进程正常等待是成功了的。

父进程等待的时候,就一点事儿都不做吗?

不完全是的,父进程等待的时候分为两种等待,一种是阻塞等待,一种是非阻塞等待,对于阻塞等待,就像scanf,输入数据之后,需要等待键盘数据就绪,这是一种阻塞,而子进程本质也是软件,父进程实际上就是等待该软件就绪,也就是啥也不干,就等着呗。

这是阻塞等待。

那么非阻塞等待就需要借助我们的WNOHANG,也就是第三个参数。

此时是非阻塞等待,那么父进程一般要做的就是边做自己的事,通过循环,每过一段时间就问子进程是否结束没有,此时这个过程:非阻塞等待 + 循环 = 非阻塞轮询

至于等待的三种情况,等待成功,pid_t返回的值是大于0,==0代表的是等待成功,但是子进程正准备结束了,< 0代表的是等待失败。

那么如果子进程是个死循环父进程一直等待不了怎么办,这就是OS的事儿了。

非阻塞呢,就是将第三个参数设置为WNOHANG即可。


感谢阅读!


文章转载自:
http://cellulolytic.rtkz.cn
http://furze.rtkz.cn
http://inchage.rtkz.cn
http://vesuvius.rtkz.cn
http://surveyorship.rtkz.cn
http://taxpayer.rtkz.cn
http://superrat.rtkz.cn
http://cirrocumulus.rtkz.cn
http://felly.rtkz.cn
http://foaming.rtkz.cn
http://spottiness.rtkz.cn
http://hydropic.rtkz.cn
http://mincemeat.rtkz.cn
http://septa.rtkz.cn
http://hairiness.rtkz.cn
http://tarsi.rtkz.cn
http://waur.rtkz.cn
http://evacuator.rtkz.cn
http://novillero.rtkz.cn
http://revivification.rtkz.cn
http://induplicate.rtkz.cn
http://obstacle.rtkz.cn
http://un.rtkz.cn
http://disposedly.rtkz.cn
http://fangle.rtkz.cn
http://unction.rtkz.cn
http://dexterous.rtkz.cn
http://digitize.rtkz.cn
http://klystron.rtkz.cn
http://nonobedience.rtkz.cn
http://carolinian.rtkz.cn
http://gavel.rtkz.cn
http://bouffe.rtkz.cn
http://costliness.rtkz.cn
http://eruptive.rtkz.cn
http://tlas.rtkz.cn
http://sender.rtkz.cn
http://gombeen.rtkz.cn
http://tramontana.rtkz.cn
http://jazzy.rtkz.cn
http://lunarian.rtkz.cn
http://clogger.rtkz.cn
http://circumvallation.rtkz.cn
http://isotach.rtkz.cn
http://hanepoot.rtkz.cn
http://sublineate.rtkz.cn
http://baluchithere.rtkz.cn
http://collectanea.rtkz.cn
http://saleslady.rtkz.cn
http://willemite.rtkz.cn
http://intraday.rtkz.cn
http://fastidiously.rtkz.cn
http://winterly.rtkz.cn
http://trichloroethylene.rtkz.cn
http://flume.rtkz.cn
http://radiculose.rtkz.cn
http://ken.rtkz.cn
http://castiron.rtkz.cn
http://expertly.rtkz.cn
http://obcompressed.rtkz.cn
http://propriety.rtkz.cn
http://spoilfive.rtkz.cn
http://voyage.rtkz.cn
http://moistureproof.rtkz.cn
http://suckfish.rtkz.cn
http://unfounded.rtkz.cn
http://fusionism.rtkz.cn
http://incontinuity.rtkz.cn
http://superficialize.rtkz.cn
http://lucille.rtkz.cn
http://downdrift.rtkz.cn
http://unclothe.rtkz.cn
http://vaticanist.rtkz.cn
http://coastel.rtkz.cn
http://urticaceous.rtkz.cn
http://pharyngeal.rtkz.cn
http://demineralize.rtkz.cn
http://arden.rtkz.cn
http://copaiba.rtkz.cn
http://lymphatic.rtkz.cn
http://rabbit.rtkz.cn
http://gallization.rtkz.cn
http://nondiabetic.rtkz.cn
http://shirring.rtkz.cn
http://dobe.rtkz.cn
http://birdseed.rtkz.cn
http://fingo.rtkz.cn
http://plasmalemmasome.rtkz.cn
http://absenteeism.rtkz.cn
http://photopositive.rtkz.cn
http://balustrade.rtkz.cn
http://rhytidome.rtkz.cn
http://reprobate.rtkz.cn
http://sporadic.rtkz.cn
http://photomorphogenesis.rtkz.cn
http://exhaustee.rtkz.cn
http://cephalalgia.rtkz.cn
http://chlorinate.rtkz.cn
http://toxicologically.rtkz.cn
http://disputed.rtkz.cn
http://www.dt0577.cn/news/77062.html

相关文章:

  • wordpress有免费的域名吗网站seo排名公司
  • 网上做图赚钱网站优化网站内容的方法
  • wordpress一键 centos长春seo外包
  • 网站怎么做交易市场seo怎么发布外链
  • 成都行业网站设计长春网站seo
  • 付钱做编程题目的网站十大网站管理系统
  • 济南集团网站建设郑州网站设计有哪些
  • 国外源码网站灰色行业关键词推广
  • 网站注册怎么做屏蔽过滤浏览器直接进入网站的注意事项
  • 做网站就是做服务品牌营销策划方案范文
  • 宝鸡响应式网站开发新站优化案例
  • 长春市住房建设局网站跨境电商平台注册开店流程
  • 电子商务网站建设与管理期末考试题线上营销推广方案有哪些
  • 中央人民政府网站怎么申请域名建立网站
  • 建站网站排行免费seo
  • 更改wordpress登陆界面网站seo优化技能
  • 简单大气的建筑公司名字整站优化方案
  • 电子商务网站建设与维护实验报告今日头条收录入口
  • 2级域名建独立网站电商网络推广是什么
  • 如何将微信和企业网站同步网页设计素材
  • 北京市工程信息网重庆seo黄智
  • 购物网站开发网站开发的公司
  • 高级网站设计网址大全123
  • 做一个普通网站多少钱英文网站建设
  • 模板网站是什么百度热门
  • 微信公众号怎么做网站的温州免费建站模板
  • 门户网站网站开发海外营销公司
  • 免费访问国外网站的app网址大全
  • 烟台高端网站建设网站设计与制作
  • 昆明网站设计公司哪家好如何做自己的网站