wait/waitpid函数等待子进程状态发生改变

news2024/9/28 17:29:45

 

🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  ​​​​​​并发与进程通信

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 - 勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇春山多胜事,赏玩夜忘归。掬水月在手,弄花香满衣。📈

目录

wait/waitpid函数

wait函数

接口

代码实例

waitpid函数

接口

代码示例


wait/waitpid函数

这两个函数用来等待某个(些)子进程的状态发生改变的,等待的状态

        发生改变有三种情况:   

            a.子进程退出(正常退出):main函数返回值/exit/_exit 
            b.子进程被信号中止 
            //c.子进程被信号唤醒(blocking -> ready)

        在子进程正常退出(a)情况,调用wait/waitpid可以释放子进程的资源,假如没有调用wait/waitpid,那么子进程退出后,就会变成僵尸进程(zomble)

        一个进程退出,操作系统会释放他大部分的资源,但是有一部分必须留给他的父进程去释放。如果一个进程退出了,但是它父进程没有wait/waitpid,这个进程就会变成僵尸进程:已经死掉了 但是资源没有被完全释放掉。

        假如一个子进程的状态已经发生改变,那么调用wait/waitpid就会立即返回,否则会阻塞调用进程直到某个子进程的状态发生改变或被信号中断。

wait函数

        pid_t wait(int *wstatus); 用来等待任意一个子进程退出的状态

        函数参数 

                int *wstatus  //指针。指向的空间,用来保存子进程的退出信息的(怎么死的,退出码等等)

                wstatus 用来保存退出的子进程的退出信息的,退出信息保存在一个整数。

                我们可以用如下宏来解析子进程的退出信息:  

                        WIFEXITED(wstatus)
                        return  true 
                        假如该子进程是正常退出的(main返回/exit/_exit)
                        只有子进程正常退出,它才会有退出码!!!

                    WEXITSTATUS(wstatus)

                        返回子进程的退出码,只有子进程正常退出 
                        这个宏才有意义,
                        把进程的退出码, unsigend char 来看待 

                WIFSIGNALED(wstatus)

                    return true  
                    假如子进程是被信号干掉的
                    ...

接口

头文件  

            #include <sys/types.h>
            #include <sys/wait.h>

        函数功能

            等待子进程退出 

        函数原型 

            pid_t wait(int *wstatus);

代码实例

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
  
int main() {  
    pid_t pid = fork();  
  
    if (pid == -1) {  
        perror("fork");  
        exit(EXIT_FAILURE);  
    } else if (pid == 0) {  
        // child process  
        printf("Child process is running.\n");  
        sleep(5);  
        printf("Child process is exiting.\n");  
        exit(EXIT_SUCCESS);  
    } else {  
        // parent process  
        printf("Parent process is running.\n");  
        printf("Child process is running.\n");  
        printf("Child process is exiting.\n");  
        sleep(5);  
        printf("Parent process is exiting.\n");  
        exit(EXIT_SUCCESS);  
    }  
}

waitpid函数

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

                pid_t pid   //指定要等待的进程或进程组

                            pid == -1,表示等待任意的子进程退出
                            pid == 0,表示等待与调用进程同组的任意子进程

                            "进程组" 

                                就是一组进程。每个进程必须会属于某一个进程组。
                                并且每个进程组,都会有一个组长进程,一般来说, 
                                创建这个进程组的进程为组长,进程组有一个组id,
                                这个组id,就是组长进程的pid,
                            pid < -1 表示等待组id等于 pid绝对值的那个组的任意子进程

                            如:  

                                pid == -128  
                                等待进程组 128那个组内的任意的子进程 

                            pid > 0,表示等待指定的子进程(其进程id为pid的那个进程)

                int *wstatus  //同上。  

                
                int options     //等待选项 

                             0:表示阻塞等待 
                             WNOHANG:非阻塞,假如没有子进程退出,则立即返回。

                wait(&wstatus)

                    <=> waitpid(-1,&wstatus,0);

            函数返回值 

            成功:返回退出的那个子进程的进程id   
            失败:返回-1,同时errno被设置。

接口

头文件  

            #include <sys/types.h>
            #include <sys/wait.h>

        函数功能

            等待子进程退出 

        函数原型 

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

代码示例

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
  
int main() {  
    pid_t pid, sid;  
  
    // fork() 创建子进程  
    pid = fork();  
  
    if (pid == -1) {  
        perror("fork");  
        exit(EXIT_FAILURE);  
    } else if (pid == 0) {  
        // child process  
        printf("Child process is running.\n");  
        sleep(5);  
        printf("Child process is exiting.\n");  
        exit(EXIT_SUCCESS);  
    } else {  
        // parent process  
        printf("Parent process is running.\n");  
        printf("Child process is running.\n");  
        printf("Child process is exiting.\n");  
        sleep(5);  
        printf("Parent process is exiting.\n");  
        exit(EXIT_SUCCESS);  
    }  
  
    // 等待子进程结束  
    sid = waitpid(-1, NULL, WNOHANG);  
  
    if (sid == -1) {  
        perror("waitpid");  
        exit(EXIT_FAILURE);  
    } else if (sid == 0) {  
        // 子进程还在运行  
        printf("Child process is still running.\n");  
        exit(EXIT_SUCCESS);  
    } else {  
        // 子进程已经结束  
        printf("Child process has finished.\n");  
        exit(EXIT_SUCCESS);  
    }  
}

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

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

相关文章

【自看】2023前端面试上岸手册——VUE部分

目录 Vue 的基本原理双向数据绑定的原理MVVM、MVC、MVP 的区别slot 是什么&#xff1f;有什么作用&#xff1f;原理是什么&#xff1f;\$nextTick 原理及作用Vue 单页应用与多页应用的区别Vue 中封装的数组方法有哪些&#xff0c;其如何实现页面更新Vue data 中某一个属性的值发…

商品管理系统【控制台+MySQL】(Java课设)

系统类型 控制台类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87738976 更多系统资源库地…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-匝道跟车基础功能

书接上回 2.3.3匝道辅助驾驶 匝道辅助驾驶功能根据导航引导在ODD范围内辅助驾驶车辆进出匝道,主动变道并入或开出主路,并可根据导航路线引导车辆通过跨高速连接路。 前置条件: 1)驾驶员设置导航目的地及导航路线 2)开启辅助驾驶功能,系统进入NOA功能 2.3.3.1.上下匝道…

如何设计一个可扩展的优惠券功能

本文主要分享了如何设计一个可扩展的优惠券功能。 一、功能特性介绍 1.每个条件的代码独立&#xff0c;相当于单独的实现类实现接口&#xff0c;就能通过配置添加到优惠券条件校验当中&#xff0c;支持多种条件灵活组合 2.新增一种使用条件可以不修改核心流程代码&#xff0…

Angular 与PDF之二:打印预览的实现

如何在angular中实现打印和预览pdf的功能, 使用print.js这个包就可实现这个功能 Print.js介绍 Print.js可以打印pdf文件&#xff0c;html元素&#xff0c;图片。官网 https://printjs.crabbly.com/ Print.js使用 首先新建一个angular项目&#xff0c;在项目里下载print.js n…

[JS每M日N练] [格物] - 你所不知道的toString

文章目录 导读Object.prototype.toString常见类型转换结果Object.toString ! Object.prototype.toString对Object.prototype.toString.call(obj)的理解 .toString.toString TypeError误区tostring被改写了定义在原型链的什么位置上方法重写 文章小结参考资料 导读 开发过程中经…

同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战

文章目录 一、现象二、问题排查三、结论四、解决方案 一、现象 使用 nacos 作注册中心的线上 dubbo 消费端应用每隔 1 分钟就会抛出以下异常&#xff08;为使描述简单化&#xff0c;文章中使用本地 demo 来复现&#xff09;&#xff0c;该异常表示无法连接到 172.17.0.1:20881…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符&#xff0c;也叫 URL地址 。是用于标识和定位Web上资源的地址&#xff0c;通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成&#xff0c;scheme:// host : port / path 例如&#xff1a; htt…

Contest3111 - 计科2101~2104算法设计与分析上机作业07

问题 A: 有重复元素的排列问题 题目描述 设R{ r 1 , r 2 , …, r n }是要进行排列的n个元素。其中元素r 1 , r 2 , …, r n 可能相同。试设计一个算法&#xff0c; 列出R的所有不同排列。给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。 输入 第1 行是元素个…

android四大组件之一-Activity实现原理分析

前言&#xff1a; 这篇文章是我花费时间最久的一篇文章&#xff0c;整整的两个月。整个流程繁琐是一个方面的原因&#xff0c;另外一个原因是我想尽可能的把整个流程的逻辑尽可能详细的一一描述出来&#xff0c;以及结合到我们项目中遇到的一些问题来进行解释&#xff0c;毕竟…

【五一创作】VS+Qt主界面内嵌自定义控件的四种方法以及不同自定义控件数据交互

前言 在Qt界面开发过程中&#xff0c;一个主界面或者主窗口看成是各个控件排列组合后的集合&#xff0c;对于一些项目而言&#xff0c;有些常用的控件可以封装成自己想要的控件样式并且复用&#xff0c;比如说&#xff0c;log显示控件&#xff0c;图像/视频显示控件等&#xf…

【ros2】ros melodic迁移到ros2 dashing过程中碰到的问题及解决方法

序言 总结踩坑经历&#xff0c;以利他人 1. error: forming pointer to reference type … & 报错原因&#xff1a; ros2回调函数的参数不能是引用形式 &&#xff0c;需要去除& 解决方法&#xff1a; 如果是指针引用&#xff0c;直接去除引用 void Callback(con…

【Java开发】Spring Cloud 11:Gateway 配置 ssl 证书(https、http、域名访问)

最近研究给微服务项目配置 ssl 证书&#xff0c;如此才可以对接微信小程序&#xff08;需要使用 https 请求&#xff09;。传统单体项目来说&#xff0c;首先往项目中添加证书文件&#xff0c;然后在配置文件中配置 ssl 证书路径、密码等相关信息&#xff1b;那么微服务这么多项…

机器学习强基计划8-5:图解局部线性嵌入LLE算法(附Python实现)

目录 0 写在前面1 流形学习2 局部线性嵌入算法2.1 什么是局部线性嵌入&#xff1f;2.2 算法原理推导 3 Python实现3.1 算法流程3.2 核心代码3.3 可视化 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的…

基于学生成绩管理系统(附源代码及数据库)

基于Ecplise&#xff0c;jsp的学生成绩管理系统 目录 登录页面 系统主页 管理员账号管理 学生查询 课程管理 成绩管理 后台数据库 源代码下载&#xff08;含数据库&#xff09; 毕设项目专栏 分为以下四大板块&#xff1a; 系统用户管理: 包含管理员账号管理&#…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDL 文章目录 5 实现&#xff1a;自适应线性单元&#x1f347;1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

第二十七章 Unity碰撞体Collision(下)

本章节我们继续研究碰撞体&#xff0c;并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程&#xff0c;然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时&#xff0c;两个球体都具备了碰撞体和刚体组件。接下来&#xff0c;我们Play运行查看效果 我们发现&…

第二十六章 Unity碰撞体Collision(上)

在游戏世界中&#xff0c;游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如&#xff0c;攻击怪物则是主角与怪物的碰撞&#xff0c;触发机关则是主角与机关的碰撞。在DirectX课程中&#xff0c;我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

浅谈区块链1.0-比特币

1. 比特币解决的问题 高度自治&#xff1a;国际经济危机无国界贸易&#xff1a;不同国家进行的贸易或者不同平台进行贸易 不可窜改&#xff1a;例如银行交易可能会被窜改数据 隐私安全&#xff1a;传统汇款方式会暴露你的个人信息&#xff0c;一旦数据库被别人入侵&#xff0c…

android基础知识复习

架构&#xff1a; 应用框架层&#xff08;Java API Framework&#xff09;所提供的主要组件&#xff1a; 名称功能描述Activity Manager&#xff08;活动管理器&#xff09;管理各个应用程序生命周期&#xff0c;以及常用的导航回退功能Location Manager&#xff08;位置管理器…