Linux进程控制——进程等待

文章目录

    • 进程等待
      • 进程等待的必要性
      • 进程等待的方法
      • status参数
      • option参数

进程等待

进程等待的过程其实是父进程等待子进程死亡的过程

进程等待的必要性

如果子进程退出,父进程不进行处理,子进程会变成僵尸进程,有内存泄漏的风险

僵尸进程只有父进程有权处理,其他指令对其都没有效果了

父进程创建子进程是为了完成某项任务,当子进程结束后,父进程有必要了解任务完成的如何

父进程需要对子进程进行回收

进程等待的方法

waitpid系统调用的返回值是pid_t,如果等待成功则返回进程pid,失败则返回-1

这个函数有三个参数,第一个参数是pid_t pid,表示需要等待的进程id,输入-1表示等待任一子进程结束

第二个参数是int* stat_loc,这是一个输出型参数,采用指针的方法获取子进程退出状态,如果我们不关心这个状态直接传入NULL即可

第三个参数是int options,默认为0,代表阻塞等待,也有非阻塞等待的情况

还有一个wait的系统调用,只有第二个参数,就相当于waitpid的默认使用情况

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>int main()
{pid_t id = fork();if(id==0){int count = 5;while(count){printf("%d: 这是一个子进程,pid为:%d\n", count, getpid());count--;sleep(1);}exit(0);}waitpid(id,NULL,0);printf("等待子进程\n");return 0;
}

image.png

我们知道的是,当子进程创建出来之后,父进程是不会进入到判断语句中的,而且也没有打印等待子进程,而是一直在执行waitpid这一行,是一直等到子进程执行完毕之后才继续执行的

status参数

父进程想要了解子进程的退出码和推出信号就需要用到这个输出型参数status

而退出码和退出信号是两个数据,怎么只用一个参数来表示,这其实就用到了位图的思想,用低八位表示异常终止的信号,剩下八位表示退出的状态

画出来就是这样的

image.png

终止信号的最高位是一个core dump标志,我们暂时先不研究

因此我们就可以通过位运算来获取退出码和终止信号

退出码是(status >> 8) & 0xFF

终止信号是status & 0x7F

我们可以手动设置一下退出码来进行验证

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>int main()
{pid_t id = fork();int status = 0;if(id==0){int count = 5;while(count){printf("%d: 这是一个子进程,pid为:%d\n", count, getpid());count--;sleep(1);}exit(21);}waitpid(id,&status,0);printf("等待子进程\n");printf("退出码:%d; 终止信号:%d\n",(status>>8)&0xFF),status&0x7F;return 0;
}

image.png

option参数

option参数的默认值为0,表示阻塞等待,就是说父进程啥也不干,就等着子进程结束,那如果想让父进程可以在等待的时候做自己的事情,就需要用一个宏定义WNOHANG

意思是 waiting no hang 父进程会继续运行下面的代码,因为waitpid的返回值是进程退出的pid,我们也就可以用这个来判断,子进程是否结束

然后写一个循环访问即可

例如

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>int main()
{pid_t id = fork();if(id==0){int count = 5;while(count){printf("%d: 这是一个子进程,pid为:%d\n", count, getpid());count--;sleep(1);}exit(21);}while(1){int wait = waitpid(id,NULL,WNOHANG);if(wait==id){printf("子进程退出,id为%d\n",wait);break;}else if(wait==0){printf("子进程未退出\n");}else{perror("waitpid");exit(1);}sleep(1);}return 0;
}

image.png

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

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

相关文章

Adobe Acrobat Pro DC for Mac:PDF处理软件

Adobe Acrobat Pro DC for Mac是一款专为Mac用户设计的PDF处理软件&#xff0c;它凭借出色的功能和卓越的性能&#xff0c;成为了处理PDF文件的理想选择。 首先&#xff0c;Acrobat Pro DC for Mac支持全方位的PDF编辑。用户可以对PDF文档进行文本编辑、图像处理、表格制作等操…

Paddlenlp测试

1、环境安装 使用华为云euleros操作系统&#xff0c;python版本3.9.5&#xff0c;CPU无GPU服务器&#xff1a; &#xff08;1&#xff09;pip3 install setuptools_scm -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com &#xff08;2&#xf…

机器学习算法与Python实战 | 两行代码即可应用 40 个机器学习模型--lazypredict 库!

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;两行代码即可应用 40 个机器学习模型 今天和大家一起学习使用 lazypredict 库&#xff0c;我们可以用一行代码在我们的数据集上实现许多…

Python 潮流周刊#62:试用自由线程 Python(摘要)

本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景&#xff1a;帮助所有读者精进 Python 技术&#xff0c;并增长职业和副业的收入。 分享了 12 篇文章&…

SQL Server数据库升级与迁移:平稳过渡的艺术

SQL Server数据库升级与迁移&#xff1a;平稳过渡的艺术 在数据库的生命周期中&#xff0c;升级和迁移是不可避免的操作。无论是升级到SQL Server的新版本&#xff0c;还是迁移到新的服务器或云环境&#xff0c;都需要谨慎处理以确保数据的完整性和业务的连续性。本文将详细介…

常见的NLP处理框架介绍!

自然语言处理&#xff08;NLP&#xff09;处理框架是指一系列用于开发、实现和部署自然语言处理应用程序的工具、库和框架。以下是一些主要的NLP处理框架的介绍&#xff1a; 一、NLTK&#xff08;Natural Language Toolkit&#xff09; 概述&#xff1a;NLTK是Python编程语言中…

雪花算法及MP实现方式

根据当前项目推进的情况&#xff0c;我们会发现用户注册时&#xff0c;从来没有考虑主键生成的问题。为什么呢&#xff1f;因为咱们的数据表现在都是通过数据库自增长方式获取主键id的。不过&#xff0c;这个主键自增长的方案好不好呢&#xff1f;我们一起来了解一下程序发展的…

SNP过滤

SNP过滤 文章目录 SNP过滤前言一. 利用Perl脚本get_vcf_stats.pl统计位点信息二. 利用R脚本149toTZC.2allele.filtered.R画图并获得过滤后的位点位置信息三. 用vcftools保留过滤后的位点四、get_vcf_stats.pl 脚本存放处 总结 SNP过滤 所属目录&#xff1a;紫菜创建时间&#…

APT UPDATE提示i386找不到错误的处理方法。

最近在ubuntu 22.04使用apt-mirror制作本地镜像源后&#xff0c;使用apt update提示,i386文件找不到。在很多网上提示&#xff0c;使用dpkg --remove-architecture i386&#xff0c;关闭i386来跳过这个错误&#xff0c;但是实际上&#xff0c;会遇到无法关闭的情况&#xff0c;…

如何查找下载安装安卓APK历史版本?

在安卓设备上&#xff0c;有时候我们可能希望安装某个软件的旧版本&#xff0c;可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过&#xff0c;通过一些第三方市场和网站&#xff0c;我们仍然可以找到并安装…

docker环境下的verdaccio设置权限并配置域名.md

权限配置 一个管理员叫admin,可以读也可以发布一个普通用户叫qiuye,只可以读,不可以发布添加账号就自行创建添加即可,只需要更改config文件的配置项即可 packages:*/*: access: admin qiuyepublish: admin unpublish: admin **:access: admin qiuyepublish: admin unpublish…

Linux——CPU占不上去的解决办法

一、将调节器升至performance&#xff1a; 1.1 查看当前的调节器&#xff1a; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor如果不是 performance &#xff0c;则进入root账户 1.2 进入root账户 先进入管理员账户输入命令&#xff1a; su root如果没有roo…

Web安全:Web体系架构存在的安全问题和解决方室

Web体系架构在提供丰富功能和高效服务的同时&#xff0c;也面临着诸多安全问题。这些问题可能涉及数据泄露、服务中断、系统被控制等多个方面&#xff0c;对企业和个人造成不可估量的损失。以下是对Web体系架构中存在的安全问题及解决方案的详细分析&#xff1a; Web体系架构存…

【小程序爬虫入门实战】使用Python爬取易题库

文章目录 1. 写在前面2. 抓包分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研…

学习java第一百四十三天

Spring中支持几种作用域 Spring容器中的bean可以分为5个范围&#xff1a; prototype&#xff1a;为每一个bean请求提供一个实例。 singleton&#xff1a;默认&#xff0c;每个容器中只有一个bean的实例&#xff0c;单例的模式由BeanFactory自身来维护。 request&#xff1a;为每…

iPhone 在 App Store 中推出的 PC 模拟器 UTM SE

PC 模拟器是什么&#xff1f;PC 模拟器是一种软件工具&#xff0c;它模拟不同硬件或操作系统环境&#xff0c;使得用户可以在一台 PC 上运行其他平台的应用程序或操作系统。通过 PC 模拟器&#xff0c;用户可以在 Windows 电脑上体验 Android 应用、在 Mac 电脑上运行 Windows …

科普文:详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

在高性能计算场景中&#xff0c;往往采用全闪存架构和内核态并行文件系统&#xff0c;以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加&#xff0c;全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS&#xff0c;是一款全用户态的云原生分布式文件…

SQL优化相关

文章目录 SQL优化1. 数据插入2. 主键优化页分裂页合并索引设计原则 3. order by 优化4. group by 优化5. limit优化6. count优化7. update 优化 SQL优化 1. 数据插入 当我们需要插入多条数据时候&#xff0c;建议使用批量插入&#xff0c;因为每次插入数据都会执行一条SQL&am…

【Linux】多线程4——线程同步/条件变量

1.Linux线程同步 1.1.同步概念与线程饥饿问题 先来理解同步的概念 什么是线程同步 在一般情况下&#xff0c;创建一个线程是不能提高程序的执行效率的&#xff0c;所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数&#xff0c;在多个线程同时对同一个内存地…

《雅思口语真经总纲1.0》话题实战训练笔记part1——4. Fruits and vegetables

《雅思口语真经总纲1.0》笔记——第四章&#xff1a;口语素材大全&#xff08;part1、part2、part3回答准则及练习方法&#xff0c;不包括范例答案&#xff09;★★★★★ 文章目录 Fruits and vegetablesWhat kind of fruit do you like?20240723答评价 范例答案 Did you lik…