当前位置: 首页 > news >正文

2.7 进程退出、孤儿进程、僵尸进程+2.8 wait函数+2.9 waitpid函数

1.进程退出

在这里插入图片描述

子进程退出时:父进程帮助子进程回收内核区的资源

exit.c

/*#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);status参数:是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {printf("hello\n");printf("world");// exit(0);_exit(0);return 0;
}

输出结果

在这里插入图片描述
刷新缓冲区

\n和fflush(stdout)在这里起的作用是刷新缓冲区
缓冲区刷新的条件:
1.进程结束。
2.遇到\n。
3.缓冲区满。
4.手动刷新缓冲区fflush(stdout)。
5.调用exit(0);但是还可以调用_exit(0),不刷新缓冲区。

2.孤儿进程

在这里插入图片描述

orphan.c

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>int main() {// 创建子进程pid_t pid = fork();// 判断是父进程还是子进程if(pid > 0) {printf("i am parent process, pid : %d, ppid : %d\n", getpid(), getppid());} else if(pid == 0) {// 让父进程先die(运行完)sleep(1);// 当前是子进程printf("i am child process, pid : %d, ppid : %d\n", getpid(),getppid());}// for循环for(int i = 0; i < 3; i++) {printf("i : %d , pid : %d\n", i , getpid());}return 0;
}

输出结果

子进程的父进程id变成init = 1
在这里插入图片描述

为什么输出时终端会在父进程结束之后在前台出现一下?

因为他不知道还有个孤儿进程没执行完毕

3.僵尸进程

在这里插入图片描述

zombie.c

子进程die,父进程没有去回收子进程的资源

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>int main() {// 创建子进程pid_t pid = fork();// 判断是父进程还是子进程if(pid > 0) {while(1) {printf("i am parent process, pid : %d, ppid : %d\n", getpid(), getppid());sleep(1);}} else if(pid == 0) {// 当前是子进程printf("i am child process, pid : %d, ppid : %d\n", getpid(),getppid());}// for循环for(int i = 0; i < 3; i++) {printf("i : %d , pid : %d\n", i , getpid());}return 0;
}

输出结果

子进程的状态已经变成zombie
在这里插入图片描述

如何解决僵尸进程

杀死父进程,让子进程被init进程托管

4.wait函数

如何在父进程中回收子进程的资源
在这里插入图片描述

wait函数是阻塞状态的:父进程中调用了wait函数,如果子进程没有结束,父进程一直处于阻塞
直到子进程结束了,父进程就不阻塞了

wait.c

/*#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *wstatus);功能:等待任意一个子进程结束,如果任意一个子进程结束了,此函数会回收子进程的资源。参数:int *wstatus进程退出时的状态信息,传入的是一个int类型的地址,传出参数。返回值:- 成功:返回被回收的子进程的id- 失败:-1 (所有的子进程都结束,调用函数失败)调用wait函数的进程会被挂起(阻塞),直到它的一个子进程退出或者收到一个不能被忽略的信号时才被唤醒(相当于继续往下执行)如果没有子进程了,函数立刻返回,返回-1;如果子进程都已经结束了,也会立即返回,返回-1.*/
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {// 有一个父进程,创建5个子进程(兄弟)pid_t pid;// 创建5个子进程// 需要注意不能直接for循环5个fork,因为fork产生新的子进程之后,会在新的子进程里继续fork// 产生孙子进程,进而呈指数级别新增进程// 所以需要判断pid = 0时breakfor(int i = 0; i < 5; i++) {pid = fork();if(pid == 0) {break;}}if(pid > 0) {// 父进程while(1) {printf("parent, pid = %d\n", getpid());// int ret = wait(NULL);int st;//传出参数// 返回值是被回收的子进程的idint ret = wait(&st);if(ret == -1) {break;}if(WIFEXITED(st)) {// 是不是正常退出printf("退出的状态码:%d\n", WEXITSTATUS(st));}if(WIFSIGNALED(st)) {// 是不是异常终止printf("被哪个信号干掉了:%d\n", WTERMSIG(st));}printf("child die, pid = %d\n", ret);sleep(1);}} else if (pid == 0){// 子进程while(1) {printf("child, pid = %d\n",getpid());    sleep(1);       }exit(0);}return 0; // exit(0)
}

退出信息相关宏函数

在这里插入图片描述

5.waitpid.c

waitpid非阻塞的好处:父进程不用一直阻塞,可以继续正常做一些业务逻辑,等到合适的时机回来检查一下是否有die的子进程需要回收

/*#include <sys/types.h>#include <sys/wait.h>pid_t waitpid(pid_t pid, int *wstatus, int options);功能:回收指定进程号的子进程,可以设置是否阻塞。参数:- pid:pid > 0 : 某个子进程的pidpid = 0 : 回收当前进程组的所有子进程    pid = -1 : 回收所有的子进程,相当于 wait()  (最常用)pid < -1 : 某个进程组的组id的绝对值,回收指定进程组中的子进程(比如-2,进程组号为2的进程组的子进程)- options:设置阻塞或者非阻塞0 : 阻塞WNOHANG : 非阻塞- 返回值:> 0 : 返回子进程的id= 0 : options=WNOHANG, 表示还有子进程活着= -1 :错误,或者没有子进程了
*/
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {// 有一个父进程,创建5个子进程(兄弟)pid_t pid;// 创建5个子进程for(int i = 0; i < 5; i++) {pid = fork();if(pid == 0) {break;}}if(pid > 0) {// 父进程while(1) {printf("parent, pid = %d\n", getpid());sleep(1);int st;// int ret = waitpid(-1, &st, 0); // 和wait()一样int ret = waitpid(-1, &st, WNOHANG);if(ret == -1) {break;} else if(ret == 0) {// 说明还有子进程存在continue;} else if(ret > 0) {if(WIFEXITED(st)) {// 是不是正常退出printf("退出的状态码:%d\n", WEXITSTATUS(st));}if(WIFSIGNALED(st)) {// 是不是异常终止printf("被哪个信号干掉了:%d\n", WTERMSIG(st));}printf("child die, pid = %d\n", ret);}}} else if (pid == 0){// 子进程// 这里是一个死循环,具体通过终端ctrl c杀死子进程的while(1) {printf("child, pid = %d\n",getpid());    sleep(1);       }exit(0);}return 0; 
}

进程组

在这里插入图片描述

相关文章:

2.7 进程退出、孤儿进程、僵尸进程+2.8 wait函数+2.9 waitpid函数

1.进程退出 子进程退出时&#xff1a;父进程帮助子进程回收内核区的资源 exit.c /*#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);status参数&#xff1a;是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取…...

【新2023Q2模拟题JAVA】华为OD机试 - 预订酒店

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:预订酒店 题目 放暑假了,橡…...

一个完整的渗透学习路线是怎样的?如何成为安全渗透工程师?

前言 1/我是如何学习黑客和渗透&#xff1f; 我是如何学习黑客和渗透测试的&#xff0c;在这里&#xff0c;我就把我的学习路线写一下&#xff0c;让新手和小白们不再迷茫&#xff0c;少走弯路&#xff0c;拒绝时间上的浪费&#xff01; 2/学习常见渗透工具的使用 注意&…...

刷完这60个标准库模块,成为Python骨灰级玩家

python强大&#xff0c;主要是因为包多&#xff0c;且不说第三方包&#xff0c;单是标准库就已让人望而生畏。 如果从第一篇整理标准库的博客算起&#xff0c;如今已有三个年头。在整理标准库的过程中&#xff0c;查阅了大量资料和官方文档&#xff0c;很多中文资料都有一个共…...

EasyExcel的简单使用(easyExcel和poi)

EasyExcel的简单使用 前言 Excel读 1.实体类 2.读监听器与测试类 3.输出结果 Excel写 1.实体类 2.写入Excel的测试类 3.输出结果 填充Excel 1.Excel模板 2.测试类 3.输出结果 前言 EasyExcel类是一套基于Java的开源Excel解析工具类&#xff0c;相较于传统的框架如Apache poi、…...

命名空间 namespace

一、命名空间的定义 定义命名空间&#xff0c;使用namespace关键字&#xff0c;后面跟命名空间的名字&#xff0c;然后接一对花括号{ } 即可&#xff0c;{ }中即为命名空间的成员。 1.一般定义 namespace test {int a 10;int b 100;int ADD(int x, int y){return x y;} }…...

我能“C”——初阶指针(上)

目录 1.什么是指针&#xff1f; 2. 指针和指针类型 3.野指针 3.1野指针的成因 3.2 如何规避野指针 1.什么是指针&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 2. 平时口语中说的指针&#xff0c;通常指的是指针…...

Android高级工程师工资为何让人艳羡不已

很多人都想有一个月入过万的梦想&#xff0c;为了实现这个梦想&#xff0c;很多人都付出了一定的努力&#xff0c;但除了付出&#xff0c;选择一个好的行业的也是非常重要的&#xff0c;就眼下而言&#xff0c;最为多金的职业莫过于Android高级工程师&#xff0c;为什么Android…...

什么猫猫最受欢迎?Python采集猫咪交易数据

前言 在日常生活中&#xff0c;我们看到可爱的猫咪表情包&#xff0c;总是会忍不住收藏 认识的一些朋友也养了猫&#xff0c;比如橘猫、英短、加菲猫之类的 看他们发朋友圈撸猫&#xff0c;老羡慕了&#xff0c;猫咪真的太可爱啦。 你是不是也动过养猫猫的小心思呢~反正我是动…...

使用Nextcloud搭建私人云盘,并内网穿透实现公网远程访问

文章目录摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名摘要 Nextcloud,它是ownCloud的一个分支,是一个文件…...

行业盛会|2023中国(东莞)国际测量控制及仪器仪表展览会

时间&#xff1a;2023年11月16-18日 地点&#xff1a;广东现代国际展览中心 ◆展会背景background&#xff1a; 众所周知,当今世界已经进入信息时代&#xff0c;信息技术成为推动科学技术高速发展的关键技术。…...

redis集群 服务器重启测试

redis集群 服务器重启测试1、集群规划&#xff1a;2台服务器 每台服务器运行3个redis实例2、重启2台服务器后redis实例没有自动重启最后一对主从节点比较 重启实例后和之前的主从分配3、再次重启2台服务器4、主从同步测试1、集群规划&#xff1a;2台服务器 每台服务器运行3个re…...

Diffusion的unet中用到的AttentionBlock详解

AttentionBlocktorch.splittorch中的permute的用法torch.transpose()view()torch.bmmsoftmax(x, dim-1)Diffusion的unet中用到的AttentionBlock详解class AttentionBlock(nn.Module):__doc__ r"""Applies QKV self-attention with a residual connection.Input…...

ElasticSearch索引文档写入和近实时搜索

一、基本概念 1.Segments In Lucene 众所周知&#xff0c;ElasticSearch存储的基本单元Shard&#xff0c;ES中一个Index可能分为多个Shard&#xff0c;事实上每个Shard都是一个Lucence的Index&#xff0c;并且每个Lucene Index由多个Segment组成&#xff0c;每个Segment事实上…...

【C语言蓝桥杯每日一题】——等差数列

【C语言蓝桥杯每日一题】——等差数列&#x1f60e;前言&#x1f64c;等差数列&#x1f64c;解题思路分析&#xff1a;&#x1f60d;解题源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&…...

EM7电磁铁的技术参数

电磁铁可以通过更换电磁铁极头在一定范围内改善磁场的大小和磁场的均匀度 &#xff0c;并且可以通过调整极头间距改变磁场的大小。主要用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场退火、核磁共振、电子顺磁共振、生物学研究、磁性测量、磁性材料取向、磁性产…...

选择很重要,骑友,怎么挑选骑行装备?

骑行装备的重要性&#xff0c;已经不用多说了&#xff0c;大家也都知道。但是如何挑选&#xff0c;如何选择适合自己的骑行装备呢&#xff1f;今天我来和大家聊一聊这个问题。首先我们需要了解一个概念&#xff1a;骑行装备分为两大类&#xff1a;骑行服和骑行鞋。对于公路车来…...

【JUC面试题】Java并发编程面试题

Java并发编程 基础知识 1. 为什么要使用并发编程&#xff1f; 提升多核系统的CPU利用率一般来说一台主机上的会有多个CPU核心&#xff0c;我们可以创建多个线程&#xff0c;理论 上讲操作系统可以将多个线程分配给不同的CPU去执行&#xff0c;每个CPU执行一个线程&#xff0c…...

spark笔记

spark笔记 1. 概述 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎&#xff1b;Spark提供内存计算&#xff0c;将计算结果直接放在内存中&#xff0c;减少了迭代计算的IO开销&#xff0c;有更高效的运算效率。 1.1 Spark核心模块 Spark Core&#xff1a;提供S…...

丢失了packet.dll原因和解决方法全面指南

packet.dll是Windows操作系统中的一个重要文件&#xff0c;它主要用于网络通信&#xff0c;如果丢失了这个文件&#xff0c;可能会导致网络连接问题。本文将探讨packet.dll文件丢失的原因&#xff0c;并提供相应的解决方法。 一、丢失packet.dll文件的原因 1. 病毒感染&#x…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...