进程控制-wait和waitpid进程回收

news2024/11/26 0:35:45
wait 阻塞函数
函数作用:
1. 阻塞并等待子进程退出
2. 回收子进程残留资源
3. 获取子进程结束状态(退出原因)
pid_t wait(int *wstatus);
返回值:
‐1 : 回收失败,已经没有子进程了
>0 : 回收子进程对应的 pid
参数 :
status 判断子进程如何退出状态
1.WIFEXITED(status): 为非 0 ,进程正常结束
返回WEXITSTATUS(status)
如上宏为真,使用此宏,获取进程退出状态的参数
2.WIFSIGNALED(status): 为非 0 ,进程异常退出
WTERMSIG(status):
如上宏为真,使用此宏,取得使进程种植的那个信号的编号
调用一次只能回收一个子进程
waitpid 函数
函数作用:同 wait 函数
pid_t waitpid(pid_t pid, int *status, int options);
参数
1.pid: 指定回收某个子进程
pid == ‐1 回收所有子进程
while( (wpid=waitpid(‐1,status,0)) != ‐1)
pid > 0 回收某个 pid 相等的子进程
pid == 0 回收当前进程组的任一子进程
pid < 0 子进程的 PID 取反(加减号)
2.status: 子进程的退出状态,用法同 wait 函数
3.options: 设置为 WNOHANG, 函数非阻塞,设置为 0 ,函数阻塞
返回值:
>0 : 返回清理掉的子进程 ID
‐1 :回收失败,无子进程
如果为非阻塞
=0 :参数 3 WNOHANG, 且子进程正在运行
#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<sys/wait.h>

int i=200;
int main()
{
int status;

pid_t pid;
pid = fork();
if (pid>0)
{
        pid_t wpid;
        wpid=wait(&status);
        printf("wpid is %d\n",wpid);
        //nomal exit 
        if (WIFEXITED(status))
        {

        printf("nomal exit value is %d\n",WEXITSTATUS(status));
        }
        //unnomal
        if(WIFSIGNALED(status))
        {
        printf("unnomal exit signal is %d\n",WTERMSIG(status));
        
        }
        i+=400;
printf("this is father process %d\n",getpid());

printf("i=%d\n",i);
}
else if(pid==0)
{
while(1)
{
        sleep(1);
printf("this is child  process %d,ppid is%d\n",getpid(),getppid());
printf("i=%d\n",i);
}

}

for(int i=0;i<3;i++)
{

printf("------i=%d\n",i);
}

程序一直执行子进程
此时打开另一个终端,终止进程,返回终止进程(异常退出)的信号 9
waitpid
#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<sys/wait.h>
int i=200;
int main()
{

pid_t pid;
pid = fork();
if (pid>0)
{       int status;
        pid_t wpid;
        while((wpid=waitpid(-1,&status,WNOHANG))!=-1)
        {
               
        printf("deid wpid is %d\n",wpid);
        //nomal exit
        if (WIFEXITED(status))
        {

        printf("nomal exit value is %d\n",WEXITSTATUS(status));
        }
        //unnomal
        if(WIFSIGNALED(status))
        {
        printf("unnomal exit signal is %d\n",WTERMSIG(status));

        }
        i+=400;
printf("this is father process %d\n",getpid());

printf("i=%d\n",i);
        }
}
else if(pid==0)
{

printf("this is child  process %d,ppid is%d\n",getpid(),getppid());


}

for(int i=0;i<3;i++)
{

printf("------i=%d\n",i);
}
return 0;
}

#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
#include<sys/wait.h>
int i=200;
int main()
{

pid_t pid;
pid = fork();
if (pid>0)
{       int status;
        pid_t wpid;
        while((wpid=waitpid(-1,&status,WNOHANG))!=-1)
        {
if(wpid==0)
{
continue;
}
               
        printf("deid wpid is %d\n",wpid);
        //nomal exit
        if (WIFEXITED(status))
        {

        printf("nomal exit value is %d\n",WEXITSTATUS(status));
        }
        //unnomal
        if(WIFSIGNALED(status))
        {
        printf("unnomal exit signal is %d\n",WTERMSIG(status));

        }
        i+=400;
printf("this is father process %d\n",getpid());

printf("i=%d\n",i);
        }
}
else if(pid==0)
{

printf("this is child  process %d,ppid is%d\n",getpid(),getppid());


}

for(int i=0;i<3;i++)
{

printf("------i=%d\n",i);
}
return 0;
}

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

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

相关文章

线上问题---反思与回顾

线上问题一&#xff1a;麦哲伦2.0 人群配置不生效 发现背景&#xff1a;产品发现三层模型部分计划个别测试计划圈选人群特征与数仓统计数据的人群不一致&#xff0c;向值班人员反馈 根因定位&#xff1a; &#xff08;1&#xff09;用户配置三层模型计划时&#xff0c;配置单…

文心一言 VS 讯飞星火 VS chatgpt (297)-- 算法导论22.1 1题

一、给定有向图的邻接链表&#xff0c;需要多长时间才能计算出每个结点的出度(发出的边的条数)&#xff1f;多长时间才能计算出每个结点的入度(进入的边的条数)&#xff1f;如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 计算出度 对于有向图的邻接链表表示&a…

rufus-4.5 制作 Clonezilla(再生龙)启动盘报syslinux-6.04下载错误

1、官网下载rufus 官网下载rufus-4.5&#xff0c;下载地址&#xff1a;https://rufus.ie/downloads/ 2、下载再生龙&#xff08;Clonezilla&#xff09; 下载最新版本&#xff1a; Clonezilla live 版本: 3.1.2-22&#xff1a;https://sourceforge.net/projects/clonezill…

在 Docker 容器中运行 Vite 开发环境,有这两个问题要注意

容器化开发给我们带来了很多便捷&#xff0c;但是在开发环境下也有一些问题要注意&#xff0c;如果不解决这些问题&#xff0c;你的开发体验不会很好。 容器启动正常&#xff0c;却无法访问 我们用 Docker 启动一个 Vite Vue3 项目的开发环境后&#xff0c;发现端口日志一切…

Springboot使用WebSocket发送消息

1. 创建springboot项目&#xff0c;引入spring-boot-starter-websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>完整项目依赖 <?xml ver…

【游戏客户端】大话版本slg玩法正式上线~~

【游戏客户端】制作率土之滨Like玩法 大家好&#xff0c;我是Lampard家杰~~ 好久好久没有更新博客了&#xff0c;有不少大佬都在后台私信我催更&#xff0c;但是很悲伤这段时间都忙的不行QAQ 那在忙什么呢&#xff1f;就是在制作一个SLG类的玩法【帮派纷争】啦 &#xff0c;布…

RNN、LSTM与GRU循环神经网络的深度探索与实战

循环神经网络RNN、LSTM、GRU 一、引言1.1 序列数据的迷宫探索者&#xff1a;循环神经网络&#xff08;RNN&#xff09;概览1.2 深度探索的阶梯&#xff1a;LSTM与GRU的崛起1.3 撰写本博客的目的与意义 二、循环神经网络&#xff08;RNN&#xff09;基础2.1 定义与原理2.1.1 RNN…

java 闭锁(CountDownLatch)

闭锁&#xff08;CountDownLatch&#xff09;是Java中的一个同步辅助类&#xff0c;用于协调多个线程之间的协作。它允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成。闭锁非常适用于需要等待一组事件发生之后再执行某些操作的场景。 import java.uti…

【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

文章目录 0. 分代收集理论分代假说分代GC定义 1. 垃圾回收算法1.1 标记清除&#xff08;Mark-Sweep&#xff09;算法优点缺点 1.2 标记复制算法优点缺点为什么是8:1:1&#xff1f; 1.3 标记整理算法优点缺点 2. 是否移动&#xff1f; 0. 分代收集理论 分代假说 现在多数JVM G…

Python编程学习笔记(2)--- 列表简介

1、列表是什么 列表由一系列按特定顺序排列的元素组成。可以创建包含字母表中所有字母、数字、0~9或所有家庭成员姓名的列表&#xff1b;也可以将任何东西加入列表中&#xff0c;其中的元素之间可以没有任何关系。列表通常包含多个元素&#xff0c;因此给列表指定一个表示复数…

python库(6):Pygments库

1 Pygments介绍 在软件开发和文档编写中&#xff0c;代码的可读性是至关重要的一环。无论是在博客文章、技术文档还是教程中&#xff0c;通过代码高亮可以使程序代码更加清晰和易于理解。而在Python世界中&#xff0c;Pygments库就是这样一个强大的工具&#xff0c;它能够将各…

1.2 如何让机器说人话?万字长文回顾自然语言处理(NLP)的前世今生 —— 《带你自学大语言模型》系列

本系列目录 《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a;带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型 1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xff1…

Powershell 获取电脑保存的所有wifi密码

一. 知识点 netsh wlan show profiles 用于显示计算机上已保存的无线网络配置文件 Measure-Object 用于统计数量 [PSCustomObject]{ } 用于创建Powershell对象 [math]::Round 四舍五入 Write-Progress 显示进度条 二. 代码 只能获取中文Windows操作系统的wifi密码如果想获取…

【绿色版】Mysql下载、安装、配置与使用(保姆级教程)

大家都知道&#xff0c;Mysql安装版的卸载过程非常繁琐&#xff0c;而且卸载不干净会出现许多问题&#xff0c;很容易让大家陷入重装系统的窘境。基于此&#xff0c;博主今天给大家分享绿色版Mysql的安装、配置与使用。 目录 一、Mysql安装、配置与使用 1、下载解压 2、创建…

02STM32软件安装新建工程

STM32软件安装&新建工程 1.软件安装&#xff1a;1.1Keil5 MDK安装1.2安装器件支持包离线安装支持包在线安装支持包 1.3软件注册&#xff1a;1.4安装驱动STLINK驱动JLink驱动在此文件夹下USB转串口 2开发方式&新建工程步骤&架构个人心得 1.软件安装&#xff1a; 安…

stm32精密控制步进电机(基础篇)

众所周知&#xff0c;步进电机由于使用脉冲控制&#xff0c;会比直流电机的控制稍难一些&#xff0c;但开环控制时也更加稳定。 落到做项目的时候&#xff0c;目前来说我都会先考虑步进电机&#xff0c;再去考虑直流&#xff0c;无刷这样的电机。包括毕设时所用的机械臂也是用…

Linux开发讲课33---线程实现与线程控制步骤简析

线程概述 进程是系统中程序执行和资源分配的基本单位。 每个进程都拥有自己的数据段、代码段和堆栈段&#xff0c;这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销&#xff0c;进程在演…

Java基础-内部类与异常处理

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、Java 内部类 什么是内部类&#xff1f; 使用内部类的优点 访问局部变量的限制 内部类和继承 内部…

一位3D打印工程师繁忙的一天

早晨&#xff1a;准备与规划 7:00 AM - 起床与晨练 3D打印工程师早起进行晨练&#xff0c;如跑步或瑜伽&#xff0c;以保持身心健康。晨练后&#xff0c;享用一顿健康的早餐&#xff0c;为一天的繁忙工作做好准备。 8:00 AM - 检查邮件和项目进展 在开始工作前&#xff0c;先…

封装了一个仿照抖音效果的iOS评论弹窗

需求背景 开发一个类似抖音评论弹窗交互效果的弹窗&#xff0c;支持滑动消失&#xff0c; 滑动查看评论 效果如下图 思路 创建一个视图&#xff0c;该视图上面放置一个tableView, 该视图上添加一个滑动手势&#xff0c;同时设置代理&#xff0c;实现代理方法 (BOOL)gestur…