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

初识Linux · 进程等待

目录

前言:

进程等待是什么

为什么需要进程等待

进程等待都在做什么


前言:

通过上文的学习,我们了解了进程终止,知道终止是在干什么,终止的三种情况,以及有了退出码,错误码的概念,对于错误码,我们知道不同的人对于错误码有自己的一套体系,对于退出码,我们知道可以使用echo $?来查看,并且知道了如果终止进程。

那么本文,我们来学习进程等待,我们从三个方面来看,进程等待是什么?为什么要等待?等待是在做什么?从以上几个方面,相信同学对于Linux中的进程等待有更深层次的理解。


进程等待是什么

思考:什么情况下会发生等待的情况?

情况实例:父进程创建了子进程,父进程任务结束,子进程还没有结束,父进程需要等待子进程退出。这种情况就是等待。

那么不等待会引发的后果是什么呢?

如果父进程不等待,直接退出,那么子进程会变成僵尸进程,僵尸进程导致的问题有内存泄漏,其中内存泄漏是一个很危险的问题,所以进程一般情况下,父进程都是要等待退出的。

拿bash再举一个例子,如果我们执行的所有指令,所有可执行文件bash都不回收,那么内存就是一次性的,我们的机器也用不了多久就会报废了。

所以我们得出结论:

进程等待是父进程比子进程先结束自己的任务,所以父进程为了 整个系统的稳定性,需要等待子进程。

为什么需要进程等待

进程等待除了考虑内存泄漏引发的安全问题,父进程还需要考虑获取子进程的退出信息,这是一个可选的选项,因为不是所有的子进程都需要父进程获取退出信息。

进程等待都在做什么

前面两点,即便是没有学习过进程等待的都应该知道有那么回事,今天的重点实际上是在等待子进程的时候父进程是在做什么。

那么为了介绍父进程等待的时候在做什么,我们不妨从一个函数开始->waitpid:

从man 2号手册我们可以看到,waitpid的头文件是sys/types.h sys/wait.h,其实到现在一个函数需要两个头文件我们也见怪不怪了,比如fork函数,除了types还需要的头文件是unistd,这也可以说是一种学习的里程碑吧!

那么参数方面,一共有三个:

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

一个pid,一个是输出型参数,一个是对应的选项。

三个参数的理解为,pid就是父进程要等待的子进程的pid,毕竟一个父进程可能创建多个子进程,要等待谁呢?得指定吧。第二个参数是输出型参数,可能直接这么说我们不好理解,看这段代码就知道了:

int a = 0;
scanf("%d",&a);

scanf的参数就是输出型参数,即不是给OS的,是给用户看的。第三个参数就像ls -a -l -n,这么多选项一样。

这里还有一个点,pid的参数如果我们给-1会怎么样呢?->等待的就是任意进程了

对于返回值来说,我们简单先理解为如果等待成功,返回的就是子进程的pid,否则就是返回-1:

代码为:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <stdlib.h>void ChildRun()
{//int *p = NULL;int cnt = 5;while(cnt){printf("I am child process, pid: %d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);sleep(1);cnt--;//*p = 100;}
}int main()
{
printf("I am father, pid: %d, ppid:%d\n", getpid(), getppid());pid_t id = fork();if(id == 0){// childChildRun();printf("child quit ...\n");exit(123);}sleep(7);// fahter//pid_t rid = wait(NULL);int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid > 0){printf("wait success, rid: %d\n", rid);}else{printf("wait failed !\n");}sleep(3);printf("father quit, status: %d, child quit code : %d, child quit signal: %d\n", status, (status>>8)&0xFF, status & 0x7F);return 0;
}

当然了,对于waitpid我们应该先了解一下wait:

wait其实就一个输出型参数,所以,,如果输出型参数设置为NULL,就是代表不关心这个子进程,也就没了,所以我们了解了waitpid之后,自然就了解了wait。waitpid的参数设置为-1也就和wait等效了。

对于正常来说,子进程进入了一个函数,通过cnt进行计时,5秒之后,子进程结束了,变成了僵尸,父进程还没有结束,父进程sleep一过开始回收,此时就回收成功:

我们通过指令:

 while :; do ps -xaj | head -1 && ps -xaj | grep main | grep -v grep; sleep 1;done

就可以亲眼看到了进程从僵尸状态变成了正常状态了。

此时,细心的同学发现了最后打印的时候,打印了子进程的退出码,以及一个信号码:

那么因为这里都是正常退出的,所以退出码我们自己设置的是123,所以打印出来也是123,至于有什么含义呢,我们自己规定即可。对于信号码来说,我们需要了解一个点:

退出信息的本质是什么?

退出信息本质上是一块有16bit位的空间,0 - 7bit位代表的是信号,8 - 15bit位代表的是退出码,退出信息实际上等于退出码 + 信号码,退出信息里面的core dump我们暂且不考虑,我们需要知道退出码从哪里看?

你看代码,代码打印退出码,打印信息码的时候,我们是不是通过按位与操作获取了某个特定区域的bit位并且打印出来了。那个操作实际上就是代表的取退出码和取信号码。

那么你是否会觉得退出码和信号码为什么只需要这么多个?

我们可以看:

拿信号举例,一共就那么多,7个bit位还多了呢,退出码同理可得即可。

那么这里我们注意一下,11号信号是段错误,我们如果让子进程发生越界访问:

也就是这里让空指针修改一下:

可以看到退出码为0,可是我们知道如果发生了越界,进程终止实际上是被信号所杀,退出码实际上是没有用处的,这里的信号码为11,我们就知道了,是OS给子进程发送了11号信号,从而导致了子进程终止,但是父进程正常等待是成功了的。

父进程等待的时候,就一点事儿都不做吗?

不完全是的,父进程等待的时候分为两种等待,一种是阻塞等待,一种是非阻塞等待,对于阻塞等待,就像scanf,输入数据之后,需要等待键盘数据就绪,这是一种阻塞,而子进程本质也是软件,父进程实际上就是等待该软件就绪,也就是啥也不干,就等着呗。

这是阻塞等待。

那么非阻塞等待就需要借助我们的WNOHANG,也就是第三个参数。

此时是非阻塞等待,那么父进程一般要做的就是边做自己的事,通过循环,每过一段时间就问子进程是否结束没有,此时这个过程:非阻塞等待 + 循环 = 非阻塞轮询

至于等待的三种情况,等待成功,pid_t返回的值是大于0,==0代表的是等待成功,但是子进程正准备结束了,< 0代表的是等待失败。

那么如果子进程是个死循环父进程一直等待不了怎么办,这就是OS的事儿了。

非阻塞呢,就是将第三个参数设置为WNOHANG即可。


感谢阅读!

相关文章:

初识Linux · 进程等待

目录 前言&#xff1a; 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言&#xff1a; 通过上文的学习&#xff0c;我们了解了进程终止&#xff0c;知道终止是在干什么&#xff0c;终止的三种情况&#xff0c;以及有了退出码&#xff0c;错误码的概念&#xff…...

面向对象建模

UML 关系 UML 关系主要有&#xff1a;依赖、关联、聚合、组合、实现、继承。 类图 #mermaid-svg-jcAjcVcPmgmWDpcI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jcAjcVcPmgmWDpcI .error-icon{fill:#552222;}#m…...

MetaJUI v0.4 遇到的一些问题及解决办法记录

1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载&#xff0c;https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压&#xff0c;用Unity3d 打开项目&#xff0c;会出现如下问题&#xff0c;按照图中提示操作即可。 4、打开工程后会出现…...

从零开始学习OMNeT++系列第二弹——新建一个OMNeT++的工程

上一篇第一弹介绍了OMNeT是什么以及如何安装OMNeT&#xff0c;现在来说一下如何新建一个自己的OMNeT的工程。 在 Omnet安装完成后&#xff0c;samples/tictoc 中有该例子的完整文件&#xff0c;你可以立刻运行该文件看他是怎么工作的&#xff0c;不过更推荐按接下来的步骤一步…...

【Android】布局优化—include,merge,ViewStub的使用方法

引言 1.重要性 在Android应用开发中&#xff0c;布局是用户界面的基础。一个高效的布局不仅能提升用户体验&#xff0c;还能显著改善应用的性能。随着应用功能的复杂性增加&#xff0c;布局的优化变得尤为重要。优化布局能够减少渲染时间&#xff0c;提高响应速度&#xff0c…...

传奇外网架设教程带图文解说—Gee引擎

架设前准备工作&#xff1a; ①通过百度网盘下载版本、补丁、客户端和DBC2000。版本解压到D盘&#xff0c;客户端解压到D盘或是E盘&#xff0c;补丁先不解压 ②安装和配置DBC2000&#xff0c;有些版本不一定用的是DBC2000数据库&#xff0c;看引擎默认的数据库是哪个 DBC数据…...

MySQL | excel数据输出insert语句

需求 在日常生产运维过程中&#xff0c;有很多需要进行人工梳理的excel数据&#xff0c;到了研发这一侧需要转为sql语句进行数据修正&#xff0c;如何输出insert插入语句&#xff1f; 方案 在空白列插入&#xff0c;选择需要的列 "INSERT INTO tab_name1 (name, desc) …...

足球青训俱乐部管理:Spring Boot技术驱动

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…...

一次实践:给自己的手机摄像头进行相机标定

文章目录 1. 问题引入2. 准备工作2.1 标定场2.2 相机拍摄 3. 基本原理3.1 成像原理3.2 畸变校正 4. 标定解算4.1 代码实现4.2 详细解析4.2.1 解算实现4.2.2 提取点位 4.3 解算结果 5. 问题补充 1. 问题引入 不得不说&#xff0c;现在的计算机视觉技术已经发展到足够成熟的阶段…...

【docker学习】Linux系统离线方式安装docker环境方法

centos7-linux安装docker(离线方式) 下载docker的安装文件 https://download.docker.com/linux/static/stable/x86_64/ 下载的是&#xff1a;docker-18.06.3-ce.tgz 这个压缩文件 将docker-18.06.3-ce.tgz文件上传到centos7-linux系统上&#xff0c;用ftp工具上传即可 解压…...

vscode开发uniapp安装插件指南

安装vuets的相关插件 首先是vue的相关插件&#xff0c;目前2024年9月应该是vue-offical 安装uniapp开发插件 uni-create-view &#xff1a;快速创建 uni-app 页面 安装uni-create-view之后修改插件拓展设置 勾选第一个选择创建视图时创建同名文件夹 选择第二个创建文件夹中生…...

Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用

一、Elasticsearch7.7.1集群不能相互发现的问题解决 在使用elasticsearch7.7.1搭建集群&#xff0c;使用了3台服务器作为节点&#xff0c;但在搭建的过程中发现每台服务器的elasticsearch服务都正常&#xff0c;但是不能相互发现&#xff0c;期间进行了一些配置的修改偶尔出现了…...

蓝牙Mesh介绍

蓝牙Mesh&#xff08;Bluetooth Mesh&#xff09;是一种基于蓝牙技术的无线通信网络拓扑&#xff0c;用于在设备之间创建大规模的多点到多点网络。蓝牙Mesh网络可以让多个蓝牙设备相互通信和协作&#xff0c;适合需要高覆盖范围和高可靠性的场景&#xff0c;例如智能家居、工业…...

Qt 窗口中鼠标点击事件的坐标探讨

// 鼠标点击事件 void Widget::mousePressEvent(QMouseEvent *event) {/*event->pos()、event->windowPos()和event->localPos()都表示鼠标点击位置在窗口中的位置&#xff0c;它们的值都是一样的&#xff0c;区别在于event->pos()是QPoint类型&#xff0c;event-&…...

服务器虚拟化的全面指南

1. 引言 在数字化转型的浪潮中&#xff0c;服务器虚拟化成为现代IT基础设施的核心组成部分。它通过将物理服务器资源分割成多个虚拟资源&#xff0c;极大地提高了资源利用率和灵活性。本篇文章将深入探讨服务器虚拟化的概念、优势、挑战、技术工具、最佳实践及未来发展趋势。 …...

Linux启动mysql报错

甲方公司意外停电&#xff0c;所有服务器重启后&#xff0c;发现部署在Linux上的mysql数据库启动失败.再加上老员工离职&#xff0c;新接手项目&#xff0c;对Linux系统了解不多&#xff0c;解决起来用时较多&#xff0c;特此记录。 1.启动及报错 1.1 启动语句1 启动语句1&a…...

基于大数据的二手房价数据可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…...

论文笔记:LAFF 文本到视频检索的新基准

整理了ECCV2022 Lightweight Attentional Feature Fusion: A New Baseline for Text-to-Video Retrieval 论文的阅读笔记 背景模型问题定义LAFF(Lightweight Attention Feature Fusion)LAFF Block 实验消融实验可视化对比试验 这篇文章提出了一种新颖灵活的特征融合方式&#x…...

iSTFT 完美重构的条件详解

目录 引言1. 短时傅里叶变换&#xff08;STFT&#xff09;与逆变换&#xff08;iSTFT&#xff09;概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域&#xff0c;短时傅里叶变换&#xff08;Short-Time Fourier Transform&#xff0c;简…...

SSH(安全外壳协议)可以基于多种加密算法

SSH&#xff08;安全外壳协议&#xff09;可以基于多种加密算法&#xff0c;确保数据的机密性和完整性。以下是 SSH 中常见的加密类型&#xff1a; 1. 对称加密 对称加密算法用于加密会话中的数据&#xff0c;常见的算法包括&#xff1a; AES&#xff08;高级加密标准&#…...

Navicat 工具 下载安装

准备工作 下载 下载链接&#xff1a;https://www.123865.com/ps/EF7OTd-kdAnH 演示环境 操作系统&#xff1a;windows10 产品&#xff1a;Navicat 版本&#xff1a; 15.0.25 注意&#xff1a;如果需要其他版本可以自行下载。 安装步骤 1、解压&#xff08;如果解压中出现提示…...

家用高清投影仪怎么选?目前口碑最好的投影仪推荐

双十一马上要到了&#xff0c;而且今年还有投影仪的家电国补&#xff0c;所以大家入手投影仪的需求也越来越多&#xff0c;但是家用高清投影仪怎么选&#xff1f;什么投影仪最适合家用&#xff1f;家庭投影仪哪个牌子质量最好&#xff1f;今天就给大家做一个2024性价比高的家用…...

阿里云盾同步漏洞之限制请求数

阿里云sdk不支持一次性请求太多&#xff0c;所以我们需要限制每次请求最大1000条&#xff0c;此代码无任何参考意义。仅做记录 func VulList(hole_type string) ([]*sas20181203.DescribeVulListResponseBodyVulRecords, error) {pageSize : 20allItems : make([]*sas20181203…...

docker安装kafka-manager

kafkamanager docker安装_mob64ca12d80f3a的技术博客_51CTO博客 # 1、拉取镜像及创建容器 docker pull hlebalbau/kafka-manager docker run -d --name kafka-manager -p 9000:9000 --networkhost hlebalbau/kafka-manager# 2、增设端口 腾讯云# 3、修改防火墙 sudo firewall-…...

Android Studio 新版本 Logcat 的使用详解

点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志&#xff0c;会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具&#xff0c;它可以更快的帮助开发者调试应用程序。 步入正题&#xff0c;看图说话。 点…...

基于php摄影门户网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

uniapp中uni.request的统一封装 (ts版)

文章目录 前言一、我们为什么要去封装&#xff1f;二、具体实现1.创建一个请求封装文件&#xff1a;2.封装 uni.request&#xff1a;3.如何去使用&#xff1f; 总结 前言 在uniapp中如何去更简洁高效的发送我们的请求&#xff0c;下面就介绍了uni.request()二次封装。 一、我们…...

记录一次gRpc流式操作(jedis版)

使用背景: 从redis队列中发送和消费消息.(使用gRpc的流式实现的消费消息) gRpc协议类定义 service方法定义 service MQDataService{ rpc sendFacebookAndroidMsg(google.protobuf.StringValue)returns (ResultProto); rpc receiveFacebookAndroidMsg(empty)returns (stream g…...

20241001国庆学习

n60f/p 这个n是指旋转磁场的速度。 极数表示旋转转子的永磁体极数&#xff0c;具有一对N极&#xff0f;S极的电机称为双极电机。 极数可以是2、4、6、8等。 &#xff08;从电机控制的角度来看&#xff0c;当极数增加一倍时&#xff0c;转速将减半&#xff0c;当极数增加四倍时…...

有服务器和域名怎么做网站/百度网址大全设为主页

在自动驾驶进入新一轮疯狂的“硬件堆砌”阶段&#xff0c;更大的隐患也在出现。 4月19日&#xff0c;滴滴自动驾驶在上海车展发布全新硬件平台 “滴滴双子星”。相较上一代&#xff0c;硬件平台在传感器数量级和种类&#xff0c;以及性能算力方面都大幅提升。 其中&#xff0…...

仙游网站建设/seo搜索引擎优化是做什么的

本文已收录GitHub&#xff0c;更有互联网大厂面试真题&#xff0c;面试攻略&#xff0c;高效学习资料等 一、前言 很多小伙伴反馈说&#xff0c;高并发学了那么久&#xff0c;但是在真正做项目时&#xff0c;仍然不知道如何下手处理高并发业务场景&#xff01;甚至很多小伙伴仍…...

vps做网站教程/百度搜索指数排行

1. 在GitHub上新建reposity 2. 将reposity clone到本地PC git clone命令会在本地主机生成一个目录&#xff0c;与远程主机的版本库同名。如果要指定不同的目录名&#xff0c;可以将目录名作为git clone命令的第二个参数。 3. 添加主机名 git clone的时候自动加载了fetch和push的…...

个人网站后台管理/深圳推广服务

摘要: 如果想要建立一个可伸缩的高可靠性的网站,就需要了解集群技术(clustering).本文中,Abraham Kang介绍了J2EE集群,怎样实现集群, 并列出Bluestone Total-e-server, Sybase Enterprise Application Server, SilverStream Application Server 和WebLogic Application Server在…...

做造价在那个网站比较好/武汉网络推广广告公司

2019独角兽企业重金招聘Python工程师标准>>> http://www.yiibai.com/maven/deploy-maven-based-war-file-to-tomcat.html 在本教程中&#xff0c;我们将学习如何使用Maven的Tomcat插件打包并部署一个WAR文件到Tomcat(Tomcat的6和7。 要用到工具&#xff1a; Maven 3…...

怎么通过网站打广告/网站制作公司哪家好

简介&#xff1a; puppet是一种Linux、Unix平台的集中配置管理系统&#xff0c;使用ruby语言&#xff0c;可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源&#xff0c;puppet的设计目标是简化对这些资源的管理 以及妥善处理资源间的依赖关…...