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

【Linux】进程结束和进程等待

进程的结束

退出码的认识

在我们学习C/C++的时候我们通常在进行写main函数时,main函数主体写完后通常会进行写一条语句 " return 0 " ,这里的这条语句到底是什么意思呢??

我们知道当在主函数中调用其他函数或者在其他函数中实现函数调用时,return 进行返回时是将return 后面的语句进行返回到调用该函数内,通过变量进行接收,main函数中return 后面的返回值其实就是退出码。

退出码的概念

退出码是用来标定程序执行结果是否正确。

进程退出的情况

  • 进程跑完了,并且进程结果正确------------return 0
  • 进程跑完了,但是进程的结果不正确------return !0
  • 进程没有跑完中途挂掉了,此时退出码没有意义

查看进程码

命令:echo $? 

           查看最近一个进程运行的退出码

  • 思考:为什么进行查询完test程序的退出码后,在进行查询进程的退出码后显示进程的退出码为0呢??

答案是进行查看进程退出码的命令也是一个进程,该进程正常结束,所以通过查询最近一条进程的退出码是0。

如何设定main函数的退出码??

当我们不关心程序程序的退出码时,直接返回0即可;当我们关心进程的退出码时,此时就需要返回特定的退出码。

特定的退出码一般代表特定的错误

这种通过打印退出码的方式对计算机是非常友好的,但是对人是非常不友好的,所以我们通常将退出码进行文字描述,进行文字描述既可以自定义进行实现,也可以通过使用系统中的映射关系。

利用库函数strerror进行打印所有错误码和错误码的描述(系统)

错误码进行自定义描述

进程中止的三种方式

  • main函数的return
  • exit:exit是C语言的库函数
  • _exit:_exit 是系统调用

exit和return 的区别

exit不需要在main函数中即可达到main函数中return的效应,直接退出程序并将错误码进行保留。

exit和_exit的区别

当存在换行符时,在main函数中进行打印ret结果可以进行呈现出来

当不存在换行符时,通过exit进行中止的进程ret还是可以被打印出来,但是_exit进行中止进程的ret没有显现

产生上面现象的原因是 _exit之所以没有显现出来是因为ret的内容进行放到了缓冲区中,exit是可以进行刷新缓冲区的,但是_exit不会进行刷新缓冲区。

  • 这个缓冲区到底存在于哪里呢??是操作系统吗?

答案是不是,因为库函数exit就是通过调用系统接口_exit进行实现的,要是这个缓冲区存在于操作系统的话,exit和_exit结果应该是一致的。

其实这个缓冲区存在于用户层面。

进程等待

为什么要进行进程等待?

进程中有一种状态是僵尸状态,进程长期处于僵尸状态会造成内存泄漏,进程等待就是为了解决僵尸进程问题。回收子进程的资源,获取子进程的退出状态。

解决僵尸问题的方法

wait和waitpid

注意事项:头文件两个都必须要进行包含,其中wait和waitpid中的参数status是指向整数的指针,用于存储子进程的退出状态。

观察解决僵尸进程现象

刚开始两个进程处于休眠状态,之所以是休眠状态而不是运行时状态我们之前都已经详细讲过这里就不在进行详细介绍,然后子进程进行退出,此时父进程正在sleep 没有通过wait进行回收子进程,此时的子进程处于僵尸状态,当父进程将子进程的资源进行回收,并且获取子进程退出状态。

wait系列回去子进程的退出信息的本质

wait和waitpid进行解决僵尸进程的问题是通过读取僵尸进程task_struct结构体中的exit_code和exit_signal来进行获取子进程的退出状态的。

wait和waitpid参数的认识

  • pid:指定父进程要等待的子进程的进程 ID。这个参数可以有多种取值方式:
    • pid > 0:父进程等待进程 ID 为 pid 的子进程。
    • pid == 0:父进程等待任何属于同一个进程组的子进程。
    • pid == -1:父进程等待任何子进程(行为与 wait 相同)。
    • pid < -1:父进程等待进程组 ID 为 |pid| 的子进程。
  • status:与 wait 调用相同,用于接收子进程的退出状态。
  • options:可以使用以下选项控制 waitpid 的行为:
    • WNOHANG:非阻塞模式,立即返回。如果没有子进程退出,则返回 0。
    • WUNTRACED:如果子进程停止(例如,通过接收到信号),也返回状态信息。
    • WCONTINUED:如果子进程在停止后继续运行,返回状态信息

接收进程的退出状态 status 的底层

通过上面的现象我们想要获取的子进程的退出状态是exit返回给父进程的15,但是我们通过status获取的子进程的退出状态竟然是3840这一串数字,其实status获取子进程的退出状态并不是按照整数的整体进行获取的,而是按照以下方式进行编码的。

 退出状态的编码

退出状态一般是一个 16 位的整数,具体编码方式如下:

  • 低 8 位:包含子进程的退出状态码(对于正常退出是 exit() 返回的值)。
  • 高 8 位:用于指示子进程是否因信号终止。

底层的方法

宏封装的方法

阻塞式等待和非阻塞式等待

阻塞式等待

对于options的参数,我们默认是进行传入参数0,此时父进程进行等待子进程退出的方式是阻塞式等待,当子进程并未进行退出时,父进程加入到阻塞队列中,等待CPU的调度,父进程处于休眠状态,当父进程接收到子进程的退出信号时,父进程被激活开始进行回收子进程并获取子进程的退出状态。
操作系统中的阻塞式等待给我们用户层的主管感受就是系统好像卡住了,例如cin 和scanf 在等待我们进行输入时

非阻塞式等待

当将options的参数进行传入1时,此时父进程进行等待子进程的方式时非阻塞式等待,但是我们通常不是通过传入数字1进行的,而是通过定义宏(WNOHANG)进行实现,这样的好处当后续进行阅读代码时的,代码的可读性比较好,非阻塞式等待是当父进程在进行等待子进程退出的过程中还可以继续执行其他进程。非阻塞时需要进行轮回检测。

下面是阻塞等待和非阻塞等待的伪代码

相关文章:

【Linux】进程结束和进程等待

进程的结束 退出码的认识 在我们学习C/C的时候我们通常在进行写main函数时&#xff0c;main函数主体写完后通常会进行写一条语句 " return 0 " &#xff0c;这里的这条语句到底是什么意思呢&#xff1f;&#xff1f; 我们知道当在主函数中调用其他函数或者在其他函…...

可编辑精品PPT | 城投集团(行业)数字化解决方案

这个PPT详细介绍了城投集团的数字化转型解决方案。首先&#xff0c;它概述了数字化转型的背景&#xff0c;包括政策要求和行业趋势&#xff0c;并指出集团在信息化方面取得的阶段性成果及存在的不足。方案提出了数字化转型的总体规划&#xff0c;明确了总体目标、思路和推进策略…...

统计学习算法——决策树

内容来自B站Up主&#xff1a;风中摇曳的小萝卜https://www.bilibili.com/video/BV1ar4y137GD&#xff0c;仅为个人学习所用。 问题引入 有15位客户向某银行申请贷款&#xff0c;下面是他们的一些基本信息&#xff0c;类别列表示是否通过贷款申请&#xff0c;是表示通过贷款申…...

基于网络爬虫技术的网络新闻分析

文末附有完整项目代码 在信息爆炸的时代&#xff0c;如何从海量的网络新闻中挖掘出有价值的信息呢&#xff1f;今天就来给大家分享一下基于网络爬虫技术的网络新闻分析的实现过程。 首先&#xff0c;我们来了解一下系统的需求。我们的目标是能够实时抓取凤凰网新闻、网易新闻、…...

51_Lua面向对象编程

面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。像C++、Java、Objective-C、Smalltalk、C#、Ruby等编程语言都支持面向对象编程。 1.面向对象编程特性 面向对象编程是一种编程范式,它使用“对象”来设计软件。对象是数据和行为的封装单元…...

关于在 Kotlin DSL 中,ndk 的配置方式

在 Kotlin DSL 中&#xff0c;ndk 的配置方式有所不同&#xff0c;取决于 Android Gradle 插件版本。ndk { abiFilters(…) } 在 Kotlin DSL 中实际上是 externalNativeBuild 的一部分&#xff0c;需要通过正确的上下文调用。 错误代码&#xff1a; ndk {abiFilters("ar…...

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成&#xff0c;CVPR2024 code&#xff1a;CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper&#xff1a;2311.10329 背景 研究问题&#xff1a;这篇文…...

Spring Boot 应用开发入门

一、Spring Boot简介 Spring Boot 是一个基于 Spring 框架的开源 Java 基础框架&#xff0c;它简化了基于 Spring 的应用开发。Spring Boot 提供了一种快速、便捷的方式来创建独立、生产级的基于 Spring 框架的应用程序。它通过提供一系列的“启动器”依赖&#xff0c;帮助开发…...

【C语言】字符串函数详解

文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现&#xff08…...

【Vim Masterclass 笔记14】S07L29 + L30:练习课08 —— Vim 文本对象同步练习(含点评课内容)

文章目录 L29 Exercise 08 - Text Objects1 训练目标2 操作指令2.1. 打开 textobjectspractice.txt 文件2.2. 单词对象练习 Word Objects2.3. 区块对象 ( ) 练习 Block Object ( )2.4. 引用字符串练习 Quoted Strings2.5. 区块对象 [ ] 练习 Block Object [ ]2.6. 区块对象 <…...

非PHP开源内容管理系统(CMS)一览

在现代网站开发中&#xff0c;内容管理系统&#xff08;CMS&#xff09;是不可或缺的工具。虽然许多广泛使用的CMS&#xff08;如WordPress和Joomla&#xff09;是基于PHP开发的&#xff0c;但其他编程语言同样诞生了许多优秀的开源CMS&#xff0c;适用于不同需求和技术栈的项目…...

WEB 攻防-通用漏-XSS 跨站脚本攻击-反射型/存储型/DOMBEEF-XSS

XSS跨站脚本攻击技术&#xff08;一&#xff09; XSS的定义 XSS攻击&#xff0c;全称为跨站脚本攻击&#xff0c;是指攻击者通过在网页中插入恶意脚本代码&#xff0c;当用户浏览该网页时&#xff0c;恶意脚本会被执行&#xff0c;从而达到攻击目的的一种安全漏洞。这些恶意脚…...

SQLAlchemy -批量插入时忽略重复

PostgreSQL 有一个很棒的INSERT() ON CONFLICT DO NOTHING子句,您可以将其与 SQLAlchemy 一起使用: from sqlalchemy.dialects.postgresql import insert session.execute(insert(MyTable).values(my_entries).on_conflict_do_nothing())MySQL 有类似的INSERT IGNORE子句,但…...

1月13日学习

[HITCON 2017]SSRFme 直接给了源代码&#xff0c;题目名称还是ssrf&#xff0c;那么该题大概率就是SSRF的漏洞&#xff0c;进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头&#xff0c;如果存在&#xff0c;则将其拆分为数组&#xff0c;并将第一个 IP 地址…...

Steam个人开发者注册备记

具体的注册过程有很多同志已经写过了&#xff0c;这里只写一点自己搞得有点费劲的地方。有点久了记得也不多了。 1.姓名用汉语拼音&#xff0c;参考护照上的&#xff0c;一般是Zhang Sanli这样的格式&#xff0c;姓一个单词&#xff0c;名字一个单词&#xff08;不管1个字还是…...

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台&#xff0c;它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境&#xff0c;满足教育机构、企业、个人等不同场景下的考试需求。通过该系统&#xff0c;用…...

Laravel 中 Cache::remember 的基本用途

在 Laravel 中&#xff0c;Cache::remember 方法用于缓存数据&#xff0c;以提高应用程序的性能。当需要从数据库或其他较慢的数据源中检索数据时&#xff0c;可以使用 Cache::remember 来检查请求的数据是否已经被缓存。如果数据已缓存&#xff0c;则直接从缓存中读取&#xf…...

前端进程和线程及介绍

前端开发中经常涉及到进程和线程的概念&#xff0c;特别是在浏览器中。理解这两个概念对于理解浏览器的工作机制和前端性能优化非常重要。以下是详细介绍&#xff1a; 1. 什么是进程和线程&#xff1f; 进程&#xff1a; 是操作系统分配资源的基本单位。一个程序启动后&#xf…...

OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)

运行效果 工程说明 源码 vertex.glsl...

Vue Router

Vue Router4 匹配 Vue3&#xff1b;Vue Router3 匹配 Vue2。 Vue Router 是 Vue.js 官方的路由管理器。Vue Router 基于路由和组件的映射关系&#xff0c;监听页面路径的变化&#xff0c;渲染对应的组件。 安装&#xff1a; npm install vue-router。 基本使用&#xff1a; …...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...