wait/waitpid(重点)介绍

这篇具有很好参考价值的文章主要介绍了wait/waitpid(重点)介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

wait/waitpid(重点)介绍

谢谢你的阅读,如有错误请大佬留言

目录

引子:

waitpid

返回值介绍

参数介绍

pid

status

options:


引子:

 当一个进程创建子进程后,如果子进程工作结束后会进入僵尸状态,等待父进程回收子进程资源(退出码,退出信号,子进程pid),如果父进程进入死循环或者程序执行时间过长,那么子进程将会一直处于僵尸状态,占用内存空间,这是对我们不利的一种状态,这种状态连kill -9 pid 都无法解决问题,因为你无法杀死一个以及死(Z/D,僵尸状态其实也属于死亡进程,只是未被清理)的状态。那么,如何防止这样的情况呢?

我们可以调用两个系统接口,来处理子进程僵尸状态:

pid_t wait(int *status);                                                                                                                  pid_t waitpid(pid_t pid, int *status, int options);
让我们先介绍这两个的概念。

看一下代码:

wait/waitpid(重点)介绍

 我们的wait和waitpid的作用就是会暂停当前进程的执行,直到有信号到来或者子进程结束。总的来说,wait()的作用就是阻塞父进程,等待子进程。

但是我们的waitpid还有一种非暂停等待子进程的过程。

这里我们主要学waitpid/当我们的waitpid学习后,wait也明白了作用 

waitpid

pid_ t waitpid(pid_t pid, int *status, int options);

返回值介绍

返回值:

        当正常返回的时候waitpid返回收集到的子进程的进程ID;

        如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

        如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

参数介绍

pid

1、(重点)pid=-1 等待任意一个子进程退出。

waitpid(-1,NULL,0);
//等待任意的子进程退出

2、(重点)pid>0 等待指定pid进程退出。

waitpid(1234,NULL,0);
//等待pid为1234的子进程退出

(次重)pid=0 等待进程组GID 与当前进程GID的子进程结束(也就是等待同一个进程组中的任何子进程);

waitpid(0,NULL,0);
//等待GID等于当前进程GID的子进程退出

(次重)pid<-1等待进程组识别码为 pid 绝对值的任何子进程。 

等待进程组 GID 为 pid 绝对值的进程组中的任何子进程;

GID 是组ID (Group Identify),表示组的身份唯一标识
UID 是用户ID (User Identify),表示用户身份唯一标识

status

先理解实现:

        int类型的指针,我们需要在调用处定义。然后传入函数,获取信息。

int sta=0;
waitpid(-1,&sta,0);//返回型参数

这里我们根据sta会取到子进程退出信号,退出码core dump等等信息。为什么一个变量可以获得这么多的信息呢?因为他是一个4字节类型,有32位比特位,所以我们分区块,获取数据,前16位比特位我们暂且不管,我们来看看后16位比特位给我们什么信息。

当进程正常退出,遇见exit/main中return。

退出码位后16位的前8位数据。(正常退出,结果正确/错误)

wait/waitpid(重点)介绍

 如果子进程在运行期间发生越界访问或除0等严重错误时,发送信号,程序中断,这时候进程执行不到退出码,所以退出码没有意义,然后后7位为退出的信号

wait/waitpid(重点)介绍

 如何查看退出码:先右移8个比特位再位运算

int sta=0;
waitpid(-1,&sta,0);
printf("code:%d",(std>>8)&0xff);//右移后,使用位运算取到退出码
printf("code:%d",WEXITSTATUS(status));//使用宏,其实底层也是位运算,返回子进程错误码。

 如何查看退出信号:直接位运算

int sta=0;
waitpid(-1,&sta,0);
printf("code:%d",std&0x7f);//使用位运算取到退出信号,0正常退出,非0退出信号
printf("code:%d",WIFEXITED(status));//使用宏,其实底层也是位运算,
//判断子进程是否正常退出,正常返回真,非正常返回假,bool返回类型

两个宏:

WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)

WIFSIGNALED(status):如果子进程异常退出,获取退出信号,正常返回0(查看进程异常退出信号)

WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

实战使用:

正常退出:

wait/waitpid(重点)介绍

 wait/waitpid(重点)介绍

异常退出 

wait/waitpid(重点)介绍

wait/waitpid(重点)介绍

发现正常退出时候信号为0,有退出码:123;

而异常退出的时候信号为非0,子进程提前结束无退出码;


options:

        0:若pid指定的子进程没有结束,父进程挂起。若正常结束,则返回该子进程的ID。

        WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。正常结束,则返回该子进程的ID。(异常返回-1)

                这里我们介绍一下什么是进程阻塞的概念。

阻塞:指有障碍而不能通过,无法畅通。我们waitpid一般设置为阻塞状态等待子进程返回,        但是我们也可以让进程以非阻塞状态进行等待子进程结束。我第一次理解的时候,这是什么意思?

让我们画图理解下:

A等待B去游玩,但是B在工作,A等待B完成工作

wait/waitpid(重点)介绍

而这的等待有,两个方式:原地等待与边等边做自己的工作。

1、原地等待(阻塞状态):

wait/waitpid(重点)介绍

if(fork()==0)
{
    //.....
    printf("子进程未结束工作\n");
    //.....
    exit(0);
}
waitpid(-1,NULL,0);//阻塞状态等待子进程结束
//....

2、边做自己的事情等待(非阻塞)

wait/waitpid(重点)介绍

if(fork()==0)
{
    //.....
    printf("子进程未结束工作\n");
    //.....
    exit(0);
}
while(1){
    if(0==waitpid(-1,NULL,WNOHANG));//非阻塞状态等待子进程结束
    {
        //father doing own business
    }
    else
    {
        //接收到子进程pid(非0)退出等待
        break;
    } 
}
//....

 还记得wait吗

其实wait(NULL)等价于waitpid(-1,NULL,0);阻塞状态等待任意子进程结束,不需要返回值参数。

wait/waitpid(重点)介绍文章来源地址https://www.toymoban.com/news/detail-431713.html

到了这里,关于wait/waitpid(重点)介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 论文阅读:通过时空生成卷积网络合成动态模式(重点论文)

    原文链接 github code 介绍视频 视频序列包含丰富的动态模式,例如在时域中表现出平稳性的动态纹理模式,以及在空间或时域中表现出非平稳的动作模式。 我们证明了时空生成卷积网络可用于建模和合成动态模式。 该模型定义了视频序列上的概率分布,对数概率由时空ConvN

    2024年01月19日
    浏览(35)
  • 智能传感器阅读笔记-物联网用智能传感器技术的发展重点

    物联网用智能传感器技术的发展重点 包含 边缘计算算法优化 、 身份认证算法优化 和 能量采集技术 。 图1  物联网用智能传感器技术的发展重点 边缘计算算法优化 边缘计算是指在靠近物或数据源头的一侧(传感器侧),采用集检测、计算、存储、通信功能于一体的平台,

    2024年02月20日
    浏览(38)
  • php基础学习之运算符(重点在连接符和错误抑制符)

    在各种编程语言中,常用的运算符号有这三大类: 算术运算 符:+,-,*,/,% 位运算 符:,|,^,, 赋值运算 符:=,+=,-=,*=,/=,%= 比较运算 符:,,==,=,=,!= 逻辑运算 符:,||,! 条件运算 符:条件?成立执行:否则执行        //又称三目运算符 自操作运算 符:

    2024年02月19日
    浏览(37)
  • 谢谢所有可爱的粉丝友友们

    其实我很早之前就申请了CSDN账号,其中陆陆续续也在写博客,但是没有坚持下来,大家可以看到我的前期博客,少之又少,我甚至只要看一下我的博客内容,我就知道我当时在哪里,我当时在做什么,今天的帖子我也是很乐意去写,也是很久就构思好了,刚好有这么个话题活

    2024年02月06日
    浏览(46)
  • React--》学习Lodash:让你的JS代码更加优雅和易于阅读

            此时隔壁 vue专栏 正在项目实战,为了不打断它的文章连续性,我们把lodash的讲解文章搬到react专栏来进行学习,当然是否用框架或用什么框架都不会影响我们学习的恒心! 目录 初识Lodash 操作数组方法 操作语言方法 操作数学方法 操作对象方法 操作字符串方法

    2024年02月12日
    浏览(27)
  • Pycharm 安装(含四种虚拟环境的介绍 【Conda 是重点】)

    在安装Pycharm之前,确保电脑中存在python,如果不存在可以查看我的上一篇文章 Python安装教程 打开官网(https://www.jetbrains.com/pycharm/) 点击下载 包括专业版和社区版(免费) 专业版需要注册账号(收费),如果不是计算机相关专业,社区版已足够,当然如果你想下载专业版(

    2024年02月04日
    浏览(38)
  • flink中checkpoint重点介绍及生产上使用注意事项

    1、介绍 Flink Checkpoint 是 Apache Flink 提供的一种容错机制,用于保证在系统故障时数据的一致性和可靠性。 2、Flink Checkpoint内容拆分 Checkpoint 是什么? Checkpoint 是将应用程序中的状态信息(包括操作符状态、键值状态等)定期保存到持久化存储介质中的过程。它可以将整个应用

    2024年02月13日
    浏览(34)
  • IEEE参考文献格式生成 之 谢谢你Zotero!

    一开始在看到论文模板的参考文献格式时就蒙了,不知道怎么搞,墨迹了好久才发现的方法! 首先要有一个Zotero,把你的要参考的pdf挪到里面,等zotero生成条目的时候右击 用所选条目创建参考文献 。然后在里面找到 IEEE ,剩下的按照下图来就行。 这个时候就只能依靠文献部

    2024年02月04日
    浏览(56)
  • 微软新工具准确率达80%?程序员:我谢谢您

    微软宣布推出一种可以提高大型语言模型性能的新工具 Jigsaw。“大型的预训练语言模型(如 GPT-3、Codex 等),可以被调整为从程序员意图的自然语言规范中生成代码。这种自动化模型有可能提高世界上每个程序员的生产力;但是,由于这些模型可能难以理解程序语义,因此所

    2024年02月06日
    浏览(32)
  • 公文校对的艺术:如何确保你的正式文件零错误?

    公文是政府和企业中最重要的正式文件之一。一个小小的错误,不仅会影响公文的专业性,甚至可能带来法律和经济后果。因此,如何进行精准的公文校对成为了一门必不可少的技能。接下来,我们将分享一些专业的公文校对技巧,并展示为何选择“爱校对”会是你的最佳选

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包