进程等待详解

一、进程等待的作用

        我们都知道,当子进程已经结束而父进程还在执行时,子进程会变成僵尸进程,造成内存泄漏等问题,如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if(id == 0){int i = 5;while(i--){printf("I am child, mypid is : %d\n", getpid());sleep(1);}}else  {while(1){printf("I am father : %d\n", getpid());sleep(3);}}return 0;
}

        僵尸进程的危害十分严重,为了防止僵尸进程,及时地回收资源,我们可以采用进程等待的方式。

        进程等待有两点主要作用:                                                                                                                  1、父进程通过等待,回收子进程的资源。                                                                                        2、父进程通过等待,获取子进程的退出信息。 

二、进程等待的系统调用

        进程等待一般通过两个接口:wait() 以及 waitpid() 。

         1、wait() 的作用是等待任意一个子进程,默认为阻塞等待(等待时父进程阻塞,不能做其他事)。返回值:成功,返回等待的子进程的pid;失败,返回 -1。参数:输出型参数,返回的是对应子进程的退出信息。

        2、status:status有32位,我们只看低16位,0-6 低 7 位表示退出时收到的信号,7表示core dump 标识,8-15 也就是次低八位表示退出码。 

        3、waitpid()的作用也是等待,但它可以更细致的控制。参数:pid 的解释如下:

        我们一般用两个,pid == 0 表示等待任意一个子进程;pid > 0 表示等待进程ID==pid的进程。status是输出型参数,如解释 2。options 表示是否进行阻塞等待,0表示阻塞等待,1表示非阻塞等待,也可以用宏,WNOHANG表示非阻塞等待,WUNTRACED表示阻塞等待。

        返回值:在阻塞状态下,成功返回子进程pid,失败返回 -1;在非阻塞状态下,成功返回子进程pid,还在等返回0,失败返回 -1.

        测试代码:status次低八位是退出码,低七位是退出信号。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if (id == 0){int i = 5;while (i--){printf("I am child, mypid is : %d\n", getpid());sleep(1);}exit(30);//退出码}else{int status = 0;waitpid(id, &status, 0);printf("childprocess has exited, exit code : %d, exit signal : %d\n", (status>>8)&0xff, status & 0x7f);sleep(1);}return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if (id == 0){int i = 5;while (i--){printf("I am child, mypid is : %d\n", getpid());sleep(1);}i /= 0;//退出信号:浮点错误 8 exit(30);}else{int status = 0;waitpid(id, &status, 0);printf("childprocess has exited, exit code : %d, exit signal : %d\n", (status>>8)&0xff, status & 0x7f);sleep(1);}return 0;
}

        我们也可以用宏来代替位操作来得到退出码和退出信号。

WEXITSTATUS(status) 表示退出码, WTERMSIG(status) 表示退出信号 (更多在man手册查看)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【包邮送书】ARM汇编与逆向工程

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

被问了N遍的效率工具!批量自动添加好友

你还在手动输入客户号码或是微信号&#xff0c;再逐一进行搜索和添加吗&#xff1f; 现在有一个工具可以帮助你完成这项重复枯燥的工作任务&#xff0c;而且&#xff0c;这个工具不仅能够帮助你批量添加微信好友&#xff0c;更有很多自动化的功能&#xff0c;让你的办公效率得…

第二证券|AIGC行业新突破不断 文化传媒板块活跃

本周以来&#xff0c;以短剧、游戏为代表的文明传媒板块实现三连涨。3月13日&#xff0c;游戏股逆势大涨&#xff0c;游戏出海、网络游戏、短剧游戏方向领涨。到收盘&#xff0c;因赛集团以20%幅度涨停&#xff0c;掌趣科技涨超10%&#xff0c;凯撒文明、中广天择、时代出书、大…

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…

Django之Cookie

Django之Cookie 目录 Django之Cookie介绍Django操作Cookie设置Cookie浏览器查看Cookie 获取Cookie设置超时Cookie注销Cookie 模拟登录验证登录验证装饰器登录验证装饰器-升级版 介绍 当我们上网使用社交媒体或者购物时&#xff0c;浏览器需要通过一种方式来记住我们。想象一下…

Spring boot java: 无效的目标发行版: 18

idea 搭建spring boot 报错java: 无效的目标发行版: 18 本人jdk 1.8 解决方案如下&#xff1a;

学点Java打小工_Day4_数组_冒泡排序

1 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤 数据结构&#xff1a;将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组&#xff1a;存放同一种类型数据的集合&#xff0c;在…

VGG网络的代码实现

VGG网络的程序实现完全根据配置表来实现。 全连接层之前的部分属于特征提取部分&#xff0c;后三部分全连接层用来分类。 1、模型 import torch.nn as nn import torch# official pretrain weights #预训练的权重下载地址 model_urls {vgg11: https://download.pytorch.org/…

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说&#xff0c;一座城市中被埋了许多雷&#xff08;用一个只含0和1的字符串表示城市&#xff0c;1代表有雷&#xff0c;0代表无雷&#xff09;。 你作为一个排雷兵&#xff0c;需要花最少的钱引爆所有的雷来使城市中不再有雷&#xff08;太逆天了&a…

测试用例的设计(1)

目录 1. 测试用例的基本要素 2.测试用例的设计方法 2.1.基于需求设计 2.2根据功能需求测试 2.3非功能测试 3. 具体的设计方法 3.1等价类法 3.2边界值法 3.3判定表 1. 测试用例的基本要素 测试用例是为了实施测试而面向测试的系统提供的一组集合,这组集合包含:测试环境,…

Java Web开发从0到1

文章目录 总纲第1章 Java Web应用开发概述1.1 程序开发体系结构1.1.1 C/S体系结构介绍1.1.2 B/S体系结构介绍1.1.3 两种体系结构的比较1.2 Web应用程序的工作原理1.3 Web应用技术1.3.1 客服端应用技术1.3.2 服务端应用技术1.4 Java Web应用的开发环境变量1.5 Tomcat的安装与配置…

2024年3月2日~2024年3月15日周报

文章目录 一、前言二、 D 2 UNet \textrm{D}^{2}\textrm{UNet} D2UNet 阅读情况2.1 体系结构2.2 损失函数 三、遇到的问题及解决四、小结 一、前言 在上上周寻找改进网络框架与超参数的灵感&#xff0c;并跑代码查看了效果。 最近两周&#xff0c;继续修改网络框架结构&#xf…

【Unity】Tag、Layer、LayerMask

文章目录 层&#xff08;Layer&#xff09;什么是LayerLayer的应用场景Layer层的配置&#xff08;Tags & Layers&#xff09;Layer的数据结构LayerMaskLayer的选中和忽略Layer的管理&#xff08;架构思路&#xff09;层碰撞矩阵设置&#xff08;Layer Collision Matrix&…

SpringBoot(拦截器+文件上传)

文章目录 1.拦截器1.基本介绍2.应用实例1.去掉Thymeleaf案例中使用session进行权限验证的部分2.编写自定义拦截器 LoginInterceptor.java 实现HandlerInterceptor接口的三个方法3.注册拦截器1.第一种方式 配置类直接实现WebMvcConfigurer接口&#xff0c;重写addInterceptors方…

综合小区管理系统|基于Springboot的综合小区管理系统设计与实现(源码+数据库+文档)

综合小区管理系统目录 目录 基于Springboot的综合小区管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、出入管理 2、报修管理 3、车位管理 4、公告管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

day06、07-MySQL

文章目录 一、MySQL概述1.1 安装1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 二. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库…

【项目管理】进度管理

一、前言 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一个过程&#xff0c;可以由一个人在较短时间内完成。项目管理团队编制进度计划的一般步骤为&#xff1a;首先选择进度计划方法…

HTML—标签的分类,span和div标签,不同的标签之间类型转换

标签的分类&#xff1a; ①块级标签&#xff1a;无论内容多少&#xff0c;会充满整个行。大小可自定义 例&#xff1a;p&#xff0c;h1&#xff0c;ul&#xff0c;ol&#xff0c;hr 等 ②行级标签&#xff1a;自身的大小就是标签的大小&#xff0c;不会占一整行。大小不可调 例…

密码保护小贴士:如何应对常见的网络钓鱼攻击?

网络钓鱼攻击是一种常见的网络欺诈手段&#xff0c;针对个人隐私和财产安全构成威胁。以下是一些密码保护的小贴士&#xff0c;帮助您应对常见的网络钓鱼攻击&#xff1a; 1.谨慎点击链接&#xff1a;收到来历不明的邮件、短信或社交媒体消息时&#xff0c;不要轻易点击其中的…

Python 基础语法:基本数据类型(字典)

为什么这个基本的数据类型被称作字典呢&#xff1f;这个是因为字典这种基本数据类型的一些行为和我们日常的查字典过程非常相似。 通过汉语字典查找汉字&#xff0c;首先需要确定这个汉字的首字母&#xff0c;然后再通过这个首字母找到我们所想要的汉字。这个过程其实就代表了…