wait()、waitpid()函数的区别(个人总结)

 子进程无论是正常或异常退出,内核都会向父进程发送信号 SIGCHILD.,因为无论是使用wait函数(阻塞),还是使用waitpid(得循环判断)都会将父进程阻塞住,而不能执行别的操作,所以,如果父进程还需要执行别的操作,就将wait/waitpid函数置于信号捕捉函数中就可以解决这个问题了,(当然也可以在父进程中单独起个线程来解决。)

wait函数、waitpid函数每次都只能回收一个子进程。

参考该文。

 wait函数是通过waitpid函数封装的:

static inline pid_t wait(int * wait_stat)

{

    return waitpid(-1,wait_stat,0);

}

1、区别1:返回值的区别

wait函数只有两个返回值,

成功返回回收的子进程id;

失败返回-1,errno被置为ECHILD。(调用进程没有子进程,调用就会失败,wait函数用这个条件来判断是否还有子进程没有回收),

waitpid函数的第三个参数设置为WNOHANG 时,返回值相较wait多了一种返回值,waitpid发现当前进程在运行,没有已退出的子进程可收集,则立即返回,返回值为0();当所有的子进程都已回收,则返回-1.(这一点与wait是一样的,同样可以根据这个参数来判断是否还有子进程没回收)

2、区别2:

wait函数会阻塞等待子进程的退出。

waitpid函数,当第三个参数使用WNOHANG时,无子进程退出,也会立刻返回(返回值为0)

3、回收多个子进程

使用waitpid来循环回收子进程(不需要知道子进程的数量)

方法一:使用信号,在捕捉函数中调用waitpid

此处使用了信号的形式来:else if (pid > 0) {Close(connfd);signal(SIGCHLD,wait_child);}  main函数外定义回调函数void wait_child(int signo)
{while(watipid(0,NULL,WNOHANG)>0);  //大于0则继续回收return;
}

 方法二:直接在父进程中调用waitpid,参考该文。

while(1) /*无限循环保证所有子进程全部回收*/{pid_t wpid = waitpid(-1/*回收任何子进程*/, NULL, WNOHANG);if(wpid == -1){break; /*如果返回-1说明已经没有子进程了,退出循环*/}if(wpid > 0){printf("wpid: %d\n", wpid); /*打印被回收的子进程的ID*/}}//while循环中,没有使用sleep函数,也就是说,没有进程可回收,就立马返回。//这个函数,其实还可以再加一句,
if(wpid==0)continue;

使用wait函数来循环回收子进程(wait函数是阻塞进程的),参考该文

使用wait()回收多个子进程
首先使用wait()函数来回收多个子进程,我们可以在一个for循环中等待子进程的结束,创建了几个子进程就for循环等待几次,代码如下

/************************************************************>File Name  : mutipwait.c>Author     : Mindtechnist>Company    : Mindtechnist>Create Time: 2022年05月20日 星期五 17时23分57秒
************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(int argc, char* argv[])
{int i = 0;pid_t pid;for(i = 0; i < 5; i++){pid = fork();if(pid == 0){printf("child: %d\n", getpid());break;}}sleep(i);if(i == 5) /*只有父进程可以执行到i=5*/{for(i = 0; i < 5; i++){pid_t wpid = wait(NULL);printf("wpid: %d\n", wpid);}while(1){sleep(1);}}return 0;
}
//使用wait函数循环回收子进程是否也可以向waitpid一样,可以不知道进程个数呢?
这个待测试while(wait(NULL)>0);

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

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

相关文章

Android Studio实现内容丰富的安卓旅游景点预定

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 1.开发环境 android stuido3.6 jak1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看景点列表 3.查看景点详情 4.景点预定 5.购物车支付结算功能 6…

计算机网络:计算机网络概述

计算机网络&#xff1a;计算机网络概述 因特网概述网络&#xff0c;互连网&#xff0c;因特网因特网发展的三个阶段因特网的标准化工作因特网组成 计算机网络的定义计算机网络的分类按使用者分类按传输介质分类按网络的覆盖范围分类按拓扑结构分类 因特网概述 网络&#xff0c…

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

网络编程:数据库

一、作业 1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#xff09; 4> …

SAP上线计划Cutover Plan

在SAP项目中&#xff0c;上线计划Cutover Plan(另一说法是切换计划)是指在项目的最后阶段&#xff0c;即从旧系统过渡到新SAP系统的过程中&#xff0c;组织必须执行的一系列活动和步骤的详细计划。这个计划对于确保平稳、有序的系统过渡至关重要。Cutover计划通常涵盖了组织沟通…

量化交易入门(六)Python开发-函数和调用

Python当中的函数是什么呢&#xff1f;函数是一段组织好的、可重复使用的、用来实现特定功能的代码。通过合理地使用函数,我们可以大大提高程序的可读性、可扩展性和可维护性。 1、函数的定义 在Python中,使用def关键字来定义一个函数,其基本语法结构如下: def 函数名(参数列…

【漏洞复现】Progress Kemp LoadMaster 命令注入漏洞(CVE-2024-1212)

0x01 产品简介 Progress Kemp LoadMaster是一款高性能的应用交付控制器&#xff0c;具有可扩展性&#xff0c;支持实体硬件和虚拟机的负载均衡。它提供了当今应用服务所需的各种功能&#xff0c;包括深度用户验证、资安防护&#xff08;如WAF/IPS/DDoS防护&#xff09;以及零信…

阿博泰克杯第五届青少年国际IT精英挑战赛Java组一等奖项目——TimpleShop电商系统_关键代码说明书

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 TimpleShop关键代码说明书 1&#xff0e;短信验证码功能的代码&#xff1a; 2&#xff0e;js加入购物车的特效 抛物线 3&#xff0e;百度…

2024学习鸿蒙开发,未来发展如何?

一、前言 想要了解一个领域的未来发展如何&#xff0c;可以从如下几点进行&#xff0c;避免盲从&#xff1a; 国家政策落地情况就业市场如何学习 通过上述三点&#xff0c;就能分析出一个行业的趋势。大家可以看到&#xff0c;我上面的总体逻辑就是根据国家政策来分析未来方…

代码随想录day24(2)二叉树:合并二叉树(leetcode617)

题目要求&#xff1a;将两个二叉树合并&#xff0c;要求是将同位置处的两个节点值相加&#xff0c;如果一个为空那就将另一个二叉树的值覆盖。 思路&#xff1a;如果使用迭代法&#xff0c;就是通过层序遍历&#xff0c;通过队列进行判断进行相加。如果使用递归法&#xff0c;…

git基础-获取git仓库

通过本章的学习&#xff0c;应该能够配置和初始化一个仓库&#xff0c;开始和停止跟踪文件&#xff0c;暂存和提交更改。我们还将展示如何设置 Git 来忽略特定的文件和文件模式&#xff0c;如何快速轻松地撤销错误&#xff0c;如何浏览项目的历史记录并查看提交之间的更改&…

酷开科技聚焦大屏端数据研究,构建酷开系统深度挖掘大屏商业价值

中国所有的彩色大屏中&#xff0c;智能电视规模已经过半&#xff0c;OTT平台的数据价值越发引起人们关注。作为OTT行业的头部代表&#xff0c;酷开科技一直聚焦大屏端数据研究&#xff0c;目前已经形成一套基于大屏指数的智慧营销体系&#xff0c;让OTT大屏的数字营销化水平实现…

AI:150-基于深度学习的医学数据挖掘与病症关联发现

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

ModuleNotFoundError: No module named ‘torch_geometric‘

1. 解决办法——安装库 pip install torch_geometric -i https://pypi.tuna.tsinghua.edu.cn/simple总结 如果你仍然遇到问题&#xff0c;请确保你的pip或conda是最新版本&#xff0c;并且你正在使用的Python环境是激活的。此外&#xff0c;如果你的PyTorch版本与 torch_geom…

Anconda 在无网络的情况下安装想要的python环境

###windows python anconda 一、实现步骤 1、在本地安装好自己想要的python环境 2、下载conda-pack环境打包工具 conda-pack 3、将虚拟环境打包&#xff0c;将虚拟环境和Anaconda安装包拷贝到离线服务器上 4、安装Anaconda,并将虚拟环境移植到离线服务器上anaconda/envs/目…

吴恩达机器学习-可选实验室:简单神经网络(Simple Neural Network)

在这个实验室中&#xff0c;我们将使用Tensorflow构建一个小型神经网络 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.laye…

win10 配置 oh-my-posh

win10 配置 oh-my-posh 0. 前置1. 安装1.1. 软件1.2. 字体1.3. 激活1.3.1. Git Bash1.3.2. PowerShell 2. 配置2.1. 效果2.2. 说明2.3. 其他2.3.1. 新版PowerShell2.3.2 conda问题 0. 前置 这个东西毕竟是个&#xff0c;命令行美化工具&#xff0c;所以需要先有一个命令行&…

芯片与针灸

所有观点&#xff0c;全是个人猜测&#xff0c;未得到科学证实&#xff0c;请注意识别 文章目录 前言一、Trimming 是什么&#xff1f;二、获取步骤1.扎针2.针灸 总结 前言 芯片的出厂过程中&#xff0c;有一个步骤叫做 trimming&#xff1a;意思就是调整芯片的性能参数&#…

Java中的可变参数

java提供了可变参数这个语法。 可变参数本质为数组。 一般可变参数应用于形参中。用于接收实参。 此时实参可以有多种形式。 一种是最正常的&#xff0c;实参为数组名。 public class Date1 {public void one(int ... arr){int sum0;for (int x:arr){sumx;}System.out.pri…