用火车采集器发布信息时 如何获取网站栏目id,互联网策划主要做什么,免费软件app下载安装,一个com的网站多少钱今日为大家分享有关进程等待的知识#xff01;希望读完本文#xff0c;大家能有一定的收获#xff01;
正文开始#xff01; 进程等待的引进
既然我们今天要讲进程等待这个概念#xff01;那么只有我们把下面这三个方面搞明白#xff0c;才能真正的了解进程等待#x…今日为大家分享有关进程等待的知识希望读完本文大家能有一定的收获
正文开始 进程等待的引进
既然我们今天要讲进程等待这个概念那么只有我们把下面这三个方面搞明白才能真正的了解进程等待
什么是进程等待
进程等待
进程等待就是通过系统调用wait/waitpid的方式让父进程对子进程进行资源回收的等待过程
为什么要有进程等待
其中存在进程等待有两种原因
1.防止僵尸进程的产生必要的因为当子进程退出之后如果父进程不及时回收子进程的资源时会导致子进程一直处于僵死状态就连kill-9也拿他没有任何办法所以引进了进程等待来解决对操作系统资源的浪费这一点原因是进程等待存在的必要
2.既然通过了父进程创建了子进程那么我们需要知道子进程将任务完成的如何了此时就引进了进程等待这也是进程等待存在的一种原因但是这种原因不是必须的 既然上面讲到了为什么要有进程等待那么就不得不介绍进程等待是如何做到的能满足上述的两种情况
进程等待是怎么做到的
想要了解进程等待是如何做到的必须要了解有关进程等待的两个系统调用
首先验证进程等待可以将僵尸进程进行回收可以写一段代码让子进程跑起来然后退出此刻让父进程先睡会儿然后通过监视进程窗口观察子进程状态的变化即可验证 代码如下 通过复制渠道来进行监视进程的运行状态其中监视进程的代码如下 while : ; do ps ajx |head -1ps ajx |grep mytest|grep -v grep; echo -----------------------------; sleep 1;done 通过上述的情况可以发现的确可以通过wait函数将僵尸进程进行杀掉那么是如何进行杀掉的呢下面通过介绍两种等待进程的函数即可得到结论
1.wait 函数原型pid_ t wait(int *status); 首先来介绍wait函数此函数只有一个参数是一个返回型参数最后返回进程的状态其返回值类型是pid_t 类型如若进程等待成功那么将会返回子进程的pid如果在fork之前调用wait函数那么就会出现结果为-1的情况
作用进程一旦调用了wait就会立刻阻塞自己由wait分析当前进程中的某个子进程是否已经退出了如果让它找到这样一个已经变成僵尸进程的子进程wait会收集这个子进程的信息并将它彻底销毁后返回如果没有找到这样一个子进程wait会一直阻塞直到有一个出现。参数stat_loc用来保存被收集进程退出时的一些状态它是一个指向int型的指针。但如果对这个子进程是如何死掉的不在乎咱们可以将它设置为NULLpid wait(NULL);如果成功wait会返回被收集的子进程的进程ID如果调用进程没有子进程调用会失败wait返回-1同时errno会被设置为ECHILD。
2.waitpid 函数原型pid_ t waitpid(pid_t pid, int *status, int options); 第一个参数
相比较与wait函数来言waitpid的参数有三个其中第一个参数表示某个子进程的pid若不想指定特定的子进程只需要将第一个参数置为-1即可-1指的是任意子进程
第二个参数
其中第二个参数和wait中的参数是一样的是一种输出型参数用于返回子进程退出的状态信息
第三个参数
第三个参数option代表的是进程的等待方式其中默认0是阻塞等待方式
还有一种方式是WNOHANG其代表的状态是非阻塞式等待其中其返回值有三种类型
当正常返回的时候waitpid返回收集到的子进程的进程ID而调用中waitpid发现没有已退出的子进程可收集,则返回0如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在其中要想看见具体的出错信息可以利用strerror函数来进行打印 这里再介绍与一下linux中关于进程状态变量的存储方式 可以看出如果想要观察进程的退出码信息只需要将status的值右移8位然后按位与上1即可得到退出码的信息 对于终止信号的信息来眼只需要按位与一个0x1F即可获得终止信号信息
退出码信息 (status8)0xFF
终止信号信息:
status0x1F 那么是否有一种更简单的方式来获得进程退出码的信息呢而不是每次都通过这些按位操作获取的呢答案是肯定的对此C定义了宏来获取退出码的信息
1WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的如果是它会返回一个非零值。 请注意虽然名字一样这里的参数status并不同于wait唯一的参数–指向整数的指针status而是那个指针所指向的整数切记不要搞混了。 2 WEXITSTATUS(status) 当WIFEXITED返回非零值时我们可以用这个宏来提取子进程的返回值如果子进程调用exit(5)退出WEXITSTATUS(status) 就会返回5如果子进程调用exit(7)WEXITSTATUS(status)就会返回7。请注意如果进程不是正常退出的也就是说 WIFEXITED返回0这个值就毫无意义。(通俗的讲如果一个进程异常的结束了其返回值的结果就没有任何意义了也可以举个生活中的例子如果一个学生考试作弊被抓住那么不管他考多少分都没有任何意义了) 扩展
至此相关进程等待的知识介绍的大致差不多了也有一些同学可能会问到,为什么要通过系统调用来判断进程的状态呢而不是直接使用一个全局变量status直接来观察呢
这里我们就来解释一下为什么不能通过一个全局变量来判断进程状态因为进程是独立的所以对于每一个变量都有一个自己的stauts他们不能共享相同的status因为进程要想修改一个共享的数据时会引起写时拷贝的发生所以他们各自都有一份自己的statues所以不能仅仅通过一个简单的变量来观察进程的状态 至此有关进程等待的知识介绍完毕如有错误欢迎大家评论区积极指正如果对您有一定的收获欢迎留下免费的小心心