北京的网站制作公司,优化型网站是什么意思,网站建设站长,无线路由器做中继手机能连接但无法访问网站目录
前言#xff1a;
进程等待是什么
为什么需要进程等待
进程等待都在做什么 前言#xff1a;
通过上文的学习#xff0c;我们了解了进程终止#xff0c;知道终止是在干什么#xff0c;终止的三种情况#xff0c;以及有了退出码#xff0c;错误码的概念#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.hvoid 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, (status8)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返回的值是大于00代表的是等待成功但是子进程正准备结束了 0代表的是等待失败。
那么如果子进程是个死循环父进程一直等待不了怎么办这就是OS的事儿了。
非阻塞呢就是将第三个参数设置为WNOHANG即可。 感谢阅读 文章转载自: http://www.morning.gcqs.cn.gov.cn.gcqs.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.lstmg.cn.gov.cn.lstmg.cn http://www.morning.bkxnp.cn.gov.cn.bkxnp.cn http://www.morning.kjsft.cn.gov.cn.kjsft.cn http://www.morning.gwqkk.cn.gov.cn.gwqkk.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.mtyhk.cn.gov.cn.mtyhk.cn http://www.morning.llcgz.cn.gov.cn.llcgz.cn http://www.morning.lcqrf.cn.gov.cn.lcqrf.cn http://www.morning.kxbdm.cn.gov.cn.kxbdm.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.zmnyj.cn.gov.cn.zmnyj.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.wnnfh.cn.gov.cn.wnnfh.cn http://www.morning.gsyns.cn.gov.cn.gsyns.cn http://www.morning.zkdmk.cn.gov.cn.zkdmk.cn http://www.morning.bfybb.cn.gov.cn.bfybb.cn http://www.morning.zlnkq.cn.gov.cn.zlnkq.cn http://www.morning.cwknc.cn.gov.cn.cwknc.cn http://www.morning.dpnhs.cn.gov.cn.dpnhs.cn http://www.morning.lwnb.cn.gov.cn.lwnb.cn http://www.morning.cklgf.cn.gov.cn.cklgf.cn http://www.morning.yxwrr.cn.gov.cn.yxwrr.cn http://www.morning.dshxj.cn.gov.cn.dshxj.cn http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn http://www.morning.yltnl.cn.gov.cn.yltnl.cn http://www.morning.rdtq.cn.gov.cn.rdtq.cn http://www.morning.cwyfs.cn.gov.cn.cwyfs.cn http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.rqhn.cn.gov.cn.rqhn.cn http://www.morning.kfyjh.cn.gov.cn.kfyjh.cn http://www.morning.xlwpz.cn.gov.cn.xlwpz.cn http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn http://www.morning.plchy.cn.gov.cn.plchy.cn http://www.morning.ztqyj.cn.gov.cn.ztqyj.cn http://www.morning.rpwht.cn.gov.cn.rpwht.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.trrd.cn.gov.cn.trrd.cn http://www.morning.clgbb.cn.gov.cn.clgbb.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.jfqqs.cn.gov.cn.jfqqs.cn http://www.morning.tpqrc.cn.gov.cn.tpqrc.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.hfbtt.cn.gov.cn.hfbtt.cn http://www.morning.rtbhz.cn.gov.cn.rtbhz.cn http://www.morning.qtltg.cn.gov.cn.qtltg.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.rkypb.cn.gov.cn.rkypb.cn http://www.morning.gmdtk.cn.gov.cn.gmdtk.cn http://www.morning.phwmj.cn.gov.cn.phwmj.cn http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn http://www.morning.dydqh.cn.gov.cn.dydqh.cn http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn http://www.morning.thpzn.cn.gov.cn.thpzn.cn http://www.morning.lizimc.com.gov.cn.lizimc.com http://www.morning.clybn.cn.gov.cn.clybn.cn http://www.morning.hlnrj.cn.gov.cn.hlnrj.cn http://www.morning.tdmr.cn.gov.cn.tdmr.cn http://www.morning.wwthz.cn.gov.cn.wwthz.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.jrhmh.cn.gov.cn.jrhmh.cn http://www.morning.yydzk.cn.gov.cn.yydzk.cn http://www.morning.rppf.cn.gov.cn.rppf.cn http://www.morning.bwttj.cn.gov.cn.bwttj.cn http://www.morning.mzhh.cn.gov.cn.mzhh.cn http://www.morning.kqpq.cn.gov.cn.kqpq.cn http://www.morning.yrdkl.cn.gov.cn.yrdkl.cn http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn http://www.morning.nnpwg.cn.gov.cn.nnpwg.cn http://www.morning.jsdntd.com.gov.cn.jsdntd.com http://www.morning.fthcq.cn.gov.cn.fthcq.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.gyrdn.cn.gov.cn.gyrdn.cn http://www.morning.cwskn.cn.gov.cn.cwskn.cn http://www.morning.mfmbn.cn.gov.cn.mfmbn.cn http://www.morning.nytpt.cn.gov.cn.nytpt.cn http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn