进程等待waitwaitpid

文章目录

  • 进程等待
    • 进程等待的必要性
    • 进程等待的方法
      • wait
      • waitpid
      • status
    • 非阻塞等待

进程等待

任何子进程,在退出的情况下,一般必须要被父进程等待

进程等待的必要性

1.父进程通过等待,解决子进程退出的僵尸问题,回收系统资源。
2.获取子进程的退出信息,知道子进程是为什么退出的。

进程等待的方法

wait

pid_t wait(int*status);

如果子进程没有退出,父进程则一直进行堵塞等待
等待成功时,返回子进程的pid。
子进程本身是软件,父进程本质是等待某种软件条件就绪。
阻塞等待:将父进程设为S状态(非运行状态),把父进程的PCB链入子进的度队列中。

waitpid

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

返回值:
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

pid:
Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。 如果不存在该子进程,则立即出错返回。

waitpid使用:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void child() {
    int cnt = 5;
    while (cnt) {
        printf("i am child pid=%d ppid=%d cnt=%d\n", getpid(), getppid(), cnt);
        sleep(1);
        cnt--;
    }
}

int main() {
    pid_t pid;
    int status;

    // 创建子进程
    pid = fork();

    if (pid < 0) {
        // 创建子进程失败
        perror("fork error\n");
    } else if (pid == 0) {
        child();

    } else {
        // 父进程代码
        // 等待子进程结束
        if (waitpid(pid, &status, 0) == -1) {
            perror("waitpid");
            exit(EXIT_FAILURE);
        }
        // 分析子进程的退出状态
        if (WIFEXITED(status)) {
            printf("Child exited normally with status %d\n",
                   WEXITSTATUS(statu s));
        } else {
            printf("child exited abnormal\n");
        }
        // 标志位
        if (WCOREDUMP(status)) {
            printf("Child produced a core dump\n");
        } else {
            printf("Child did not produce a core dump\n");
        }
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

status

wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。
若传NULL,表示不关心子进程的退出状态。
否则,根据该参数将子进程退出信息反馈给父进程。
在这里插入图片描述

非阻塞等待

将waitpid的option参数设置为WNOHANG。
pid_t>0:等待成功了,子进程退出,父进程成功回收子进程退出信息。
pid_t<0,等待失败了。
pid_t==0,子进程还没有退出,需进行下一轮等待。

非阻塞等待+循环=非阻塞轮询
非阻塞轮询运行父进程在等待过程中做其他事

测试一下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void child() {
    int cnt = 5;
    while (cnt) {
        printf("i am child pid=%d ppid=%d cnt=%d\n", getpid(), getppid(), cnt);
        sleep(1);
        cnt--;
    }
}

int main() {
    pid_t pid;
    int status;

    // 创建子进程
    pid = fork();

    if (pid < 0) {
        // 创建子进程失败
        perror("fork error\n");
    } else if (pid == 0) {
        child();
    }
    while (1) {
        pid_t rid = waitpid(pid, &status, WNOHANG);
        if (rid == 0) {
            usleep(10000);
            printf("child is running,father check next time!\n");
            printf("doing other thing\n");
        } else if (rid > 0) {
            if (WIFEXITED(status)) {
                printf("child quit success,child exit code:%d\n",
                       WEXITSTATUS(status));
            } else {
                printf("child quit abnormal\n");
            }
            break;
        }
    }
    return 0;
}

在这里插入图片描述
实际运用中将doing other things换成其他程序或函数即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现知识管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现知识管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求&#xff0c;创建了…

012:vue结合纯CSS实现蛇形流程图/步骤条

文章目录 1. 实现效果2. 实现代码 1. 实现效果 2. 实现代码 <template><div class"container"><div v-for"(item, index) in list" class"grid-item"><div class"step">step{{index1}}</div></div&…

大厂Java笔试题之对完全数的处理

题目&#xff1a;完全数&#xff08;Perfect number&#xff09;&#xff0c;又称完美数或完备数&#xff0c;是一些特殊的自然数。 它所有的真因子&#xff08;即除了自身以外的约数&#xff09;的和&#xff08;即因子函数&#xff09;&#xff0c;恰好等于它本身。 例如&…

赋能力量,幸福花开 ——罗湖区懿米阳光开启全职妈妈社工培育计划

最美人间四月天&#xff0c;不负春光不负卿。 四月&#xff0c;迎来了全国社会工作师考试报名的日子&#xff0c;罗湖区全职妈妈妇联与罗湖区阳光妈妈妇联在服务过程中发现&#xff0c;全职妈妈们有获得社会工作师职业资格证的需求&#xff0c;为了更好地针对这一需求&#xf…

YOLOv5原创优化 : loss优化 | 一种新的自适应阈值焦点损失函数loss,增强目标特征,助力红外小目标暴力涨点

💡💡💡问题点:注意到红外小目标图像中目标与背景之间存在极大的不平衡,这使得模型更加关注背景特征而不是目标特征 💡💡💡解决对策:提出了一种新的自适应阈值焦点损失函数,该函数将目标和背景解耦,并利用自适应机制来调整损失权重,迫使模型将更多的注意力分配…

vs调试教程

官网链接&#xff1a; Microsoft Learn&#xff1a;培养开拓职业生涯新机遇的技能通过文档和培训习得技术技能、获得认证并与社区建立联系https://learn.microsoft.com/zh-cn/调试教程 调试器文档 - Visual Studio (Windows) | Microsoft Learn浏览文档&#xff0c;以帮助你使…

大厂Java笔试题之与7有关的数

题目&#xff1a;输出 1到n之间 的与 7 有关数字的个数。 一个数与7有关是指这个数是 7 的倍数&#xff0c;或者是包含 7 的数字&#xff08;如 17 &#xff0c;27 &#xff0c;37 ... 70 &#xff0c;71 &#xff0c;72 &#xff0c;73...&#xff09; 比如输入20&#xff0c;…

Laravel/Lumen 中使用 Echo + Socket.IO-Client 实现网页即时通讯广播

此处以 Lumen 9 框架为例说明如何调试通过 Echo 服务端以及客户端 安装 Redis composer require illuminate/redis&#xff0c;如果安装失败需要根据当前框架版本指定所需 Redis 版本&#xff0c;例如&#xff1a;composer require illuminate/redis "^9.0" Broa…

室外超声波自动气象站设备

TH-CQX10随着科技的进步和气象学的发展&#xff0c;气象监测设备已经从传统的有人值守模式转变为自动化、智能化的无人值守模式。室外超声波自动气象站设备就是这一转变的杰出代表。以下是室外超声波自动气象站设备的原理、应用及其优势&#xff1a; 1、室外超声波自动气象站设…

使用 Axios 处理 AxiosError 的三种常见方法

在使用 Axios 时处理 AxiosError 有几种常见的方法: 使用 try-catch 语句捕获异常: try {const response await axios.get(/api/data);// 处理响应数据 } catch (error) {if (error.response) {// 请求成功但状态码不在 2xx 范围console.log(error.response.data);console.l…

2024比特币减半,Web3的“1995时刻”即将到来

随着比特币减半的到来&#xff0c;加密货币市场迎来了一个关键的转折点。2024年的比特币减半不仅是对比特币供应和挖矿激励的一次重大调整&#xff0c;更是对整个Web3应用领域产生深远影响的事件。 首先&#xff0c;比特币减半的事件本身就为市场带来了一种稀缺性的概念&#…

绝地求生:AUG爆裂弹球黑货箱:街机动漫风格大家会喜欢吗?

大好&#xff0c;我闲游盒&#xff01; 4.10更新后&#xff0c;AUG的新成长型也出来了&#xff0c;更新后我觉得AUG变好用了一点&#xff0c;不知道大家有没有感觉出来&#xff1f; 宝箱概率 本期主角 AUG-爆裂弹球&#xff08;紫色配粉红色&#xff09; 本次的AUG我才升到5级…

蓝桥备赛——组合数、其他技巧

对字符串进行permutations排列组合 from itertools import permutations a abc #对字符串进行permutations排列组合 for i in permutations(a,3):x .join(i)print (x,end ) print (\n------------------------------------) permutations后面的参数&#xff0c;第一个表示…

vue简单使用一(vue的声明)

首先引入vue的js文件&#xff1a; <script src"js/vue.js" type"application/javascript"></script> vue.js文件去vue官网下载即可 html代码 <div class"vuePro"><div> vue的属性信息都得放在这个标签下面哪怕是同级也是…

CSS的属性【all:inherit】有什么奥秘?

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Scrapy框架内存泄漏问题及解决

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、问题背景及原因 官方文档&#xff1a;Debugging memory leaks — Scrapy 2.11.1 documentation Scrapy是一款功能强大的网络爬虫框…

12个建筑数据分析典型用例

建筑企业面临着众多挑战&#xff0c;包括紧迫的期限、预算限制和复杂的监管要求。 然而&#xff0c;很明显&#xff0c;数据分析可以成为克服这些障碍的重要工具。 建筑行业是数据最密集的市场之一&#xff0c;这就是为什么越来越需要更好的建筑分析和大数据管理。 通过大数据…

【简单讲解下Symfony框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

阿里云GPU服务器租用价格一年、1个月和1小时报价明细表

阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用&#xff0c;阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折优惠&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云GPU…

面试: 单例模式

目录 一、饿汉单例&#xff08;实现Serializable&#xff09; 1、破坏单例的三种情况 &#xff08;1&#xff09;反射破坏单例 &#xff08;2&#xff09;反序列化破坏单例 &#xff08;3&#xff09;Unsafe破坏单例 2、饿汉单例&#xff08;利用枚举实现&#xff09; 二…