进程的终止和等待

news2024/9/22 4:08:58

目录

进程终止

如何获取退出码呢?

进程退出方法有哪些?

对于进程退出,内核OS做了什么?

进程等待

为什么要进行进程等待?

如何进行进程等待?

什么是阻塞和非阻塞等待?


进程终止

对于进程退出是三种情况,第一种就是代码没跑完,程序出现了异常,然后程序退出了,这种情况是进程收到了信号终止的,比如ctrl + c给进程发送9号信号终止进程。

第二种情况是代码跑完了,结果是正确的,main函数中用 return 0 返回0值表示这种情况。  

第三种情况是代码跑完,但是结果不正确,我们自己定义不同的返回值表示不同的情况发生了,这个返回值就是退出码,要知道失败的原因,我们就可以根据进程的退出码对应了,当需要知道程序运行中发生的各种情况可以使用strerror(errno)打印错误码errno对应的错误信息,比如打开文件为什么失败等。

如何获取退出码呢?

1.可以使用命令echo $?打印在bash中最近一次进程退出的退出码

2.让父进程等待退出的子进程,获取进程的退出码

进程退出方法有哪些?

1.直接在main中return。

2.使用库函数调用void exit(int status),status填退出码,这个函数是封装了_exit函数,并在退出前刷新了C语言封装的缓冲区。

3.使用系统调用_exit函数是直接终止进程,因为是系统调用,不刷新C语言的缓冲区。

对于进程退出,内核OS做了什么?

首先将进程的状态设置为Z(僵尸状态),父进程等待成功后,将进程状态设置为X(死亡状态),回收进程代码和数据,LinuxOS可能并不会释放该进程的内核数据结构,Linux中会使用使用slab分派器,构建内核的数据结构缓冲池,将回收的进程的内核数据结构保存起来,下次创建进程时,分派器直接分派缓冲池中的废气内核数据结构,直接将其初始化即可,这样缓冲池的好处是不用重新为创建内核数据申请内存空间,提高创建进程的效率。

进程等待

为什么要进行进程等待?

1.解决僵尸状态的内存泄漏问题:

前面提到,倘若子进程退出,父进程不退出也不等待子进程,子进程就会变成僵尸状态,就会造成内存泄漏,需要父进程等待子进程退出,

2.父进程需要获取子进程的退出信息:

子进程退出的时候会把自己的退出码写入内核数据结构task_struct 中,进行进程等待的时候,OS会把子进程的task_struct中的退出码提取,于是父进程可以通过系统调用拿到子进程的退出码。

如何进行进程等待?

使用OS提供的系统调用:

1.使用pid_t wait ( int * status )函数等待任意一个退出的子进程,返回所等待的子进程的pid,参数status是一个输出型参数,status的次低八位是进程的退出码,低7位是进程的退出信号,第8位是core dump标志位表示进程退出是否产生core文件,这个文件是程序异常退出时OS把程序当前的内存内容存储在其中,可以用gdb查看core文件,查看错误的原因。

这个输出型参数status如何获取的?

        当子进程退出时,会将自己的退出信息写入对应的task_struct,进程等待时,OS从子进程的task_struct 中获取了子进程的退出码。

参数status构成如下:

代码示例:


输出:

2.使用pid_t waitpid(pid_t pid,int*status,int option)函数,以一定方式等待指定的子进程,获得子进程的退出信息。

对于返回值:>0时,表示等待子进程成功,<0表示等待子进程失败 ,=0表示非阻塞等待的子进程还没有退出

当 pid>0,表示等待指定pid的子进程,当pid=-1,表示父进程等待任意退出的子进程 ,status是输出型参数,同1


注意:

        当进程收到信号就异常退出了,程序并没有运行完,所以进程异常时只关心退出信号,不关心退出码,正常退出时,父进程获取的子进程退出信号的值是0,表示正常退出。(没有0号信号)
        代码示例中使用位操作获取退出信息,也可以使用系统提供的宏获取, WIFEXITED(status)当进程正常退出时为真,异常退出时为假,WEXITSTATUS(status)从status中提取进程的退出码。 


什么是阻塞和非阻塞等待?


        什么是阻塞等待呢?简单来说就是父进程等待的时候阻塞住了,不继续往下运行代码,底层是将父进程的PCB放入所等待的子进程的task_struct*queue 等待队列中 ,子进程退出时,代表条件就绪,就会唤醒父进程,于是父进程就可以继续往下执行代码了,对应的option参数传0就代表阻塞等待。对于非阻塞等待,将option参数传WNOHANG 表示非阻塞等待 ,当父进程调用函数时就直接检测条件是否满足,子进程是否退出,直接返回结果,然后父进程继续执行后续的代码,当子进程没有退出就返回0,可见进行一次等待时,子进程未必退出,于是需要父进程多次调用这个函数轮询检测子进程是否退出,同时可以隔一段时间去等待子进程,父进程在此期间可以完成其他工作,这是非阻塞等待的特点。

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

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

相关文章

飞依诺冲刺科创板上市:上半年出现亏损,因商业秘密纠纷被起诉

近日&#xff0c;飞依诺科技股份有限公司&#xff08;下称“飞依诺”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;飞依诺计划募资11.22亿元&#xff0c;将用于生产基地升级项目、新产品研发与总部基地建设项目、营销网络建设…

【Linux】一文掌握Linux基本指令(下)

本章命令大致总结命令功能cat打印文件内容echo打印文件内容> 输出重定向 >>追加重定向< 输入重定向 more 查看文本内容 less等价于morehead打印文本前n行tail 打印文本后n行 |管道date时间相关cal日历sort文本排序uniq相邻文本降重zip打包压缩unzip解包tar打包/解包…

蓝桥杯寒假集训第四天(全球变暖DFS)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 有一个正方形区域&#xff0c;里面有大陆和海洋&#xff0c;暂且用‘.’表示海洋&#xff0c;用‘#’表示大陆。我们把上下左右都连在一起的大陆称之为岛屿。但是随着气温…

07 来自于网友的 retrieveFileStream 的一个问题, 导致系统程序异常

前言 可以先参考前面一篇文章 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题 这里的问题 主要是来自于 某 qq 交流群的网友 呵呵 当然 这里测试用例代码…

新鲜速递:Spring Data JPA 3.0快速入门、进阶到精通

第一章、安装Spring Data JPA 第一步&#xff0c;先确保你使用的是Spring Boot 3.0或以上环境&#xff0c;可以在pom.xml里加入Spring Data JPA依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-…

【ROS】—— ROS通信机制——话题通信(二)

文章目录前言1. 话题通信1.1 话题通讯理论模型1.2 话题通信基本操作&#xff08;C&#xff09;1.2.1 简单发布框架的实现1.2.2 发布逻辑的实现1.2.3 订阅方的实现1.3 话题通信基本操作&#xff08;python&#xff09;1.3.1 发布的实现1.3.2 订阅的实现1.4 话题通信自定义msg1.4…

五问补盲(五)| 想要长得好看又好用,补盲激光雷达应该怎么做?

上期&#xff0c;我们聊了好用的补盲激光雷达&#xff0c;得满足哪些条件&#xff1f; 好用是必备素质&#xff0c;属于补盲激光雷达的底线。好用之外&#xff0c;补盲激光雷达还有一种更直观的竞争力&#xff0c;那就是——外型。 有句话说的好&#xff0c;很多时候&#xff0…

2022跟学尚硅谷Maven入门(二)IDEA操作

2022跟学尚硅谷Maven入门二 IDEA操作第四章 使用Maven&#xff1a;IDEA环境第一节 创建父工程1.创建 Project2.开启自动导入第二节 配置 Maven 信息第三节 创建 Java 模块工程第四节 创建Web模块工程1.创建模块2.修改打包方式3.Web 设定4.借助IDEA生成web.xml5.设置 Web 资源的…

数据库,计算机网络、操作系统刷题笔记21

数据库&#xff0c;计算机网络、操作系统刷题笔记21 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

基于thinkphp6搭建的 admin后台管理基础框架,方便快速进行二次开发

小牛Admin v2.1 完整代码下载地址&#xff1a;基于thinkphp6搭建的 admin后台管理基础框架 使用thinkphp6 layui 搭建的 admin后台管理基础框架&#xff0c;方便快速进行二次开发 该项目是在 http://www.xnadmin.cn/ 小牛Admin 开源项目的基础上进行个人优化的产物 运行环境…

Redis-用户签到UV统计

一、用户签到 1.1 BitMap用法 我们按月来统计用户签到信息&#xff0c;签到记录为1,未签到记录为0 把每一个bit位对应当月的每一天&#xff0c;形成了映射关系。用0和1表示业务状态&#xff0c;这种思路就称为位。Redis中是用利用string类型数据结构实现BitMap&#xff0c;因…

使用pip命令时,报错:_sysconfigdata_x86_64_conda_cos7_linux_gnu.py

问题&#xff1a; 在linux服务器中想使用pip命令pip show list查看安装了哪些包时&#xff0c;报错 ModuleNotFoundError: No module named ‘_sysconfigdata_x86_64_conda_cos7_linux_gnu’ 问题原因 原因是&#xff1a;在当前的环境下的python中丢失了一个备份文件&#xf…

经典算法之常用排序

目录❤️前言&#x1f498;一、分治思想&#x1f49e;二、归并排序1.实现方法2.动图分析3.代码模板&#x1f496;三、快速排序1.实现方法2.动图分析3.代码模板❤️前言 本文介绍两种基于分治思想的经典排序算法&#xff1a; 归并排序与快速排序 &#x1f498;一、分治思想 分…

【Python从入门到进阶】1、初识Python

一、Python的起源 1989年&#xff0c;为了打发圣诞节假期&#xff0c;荷兰程序员Gudio van Rossum吉多●范罗苏姆(龟叔&#xff0c;下图穿“人生苦短&#xff0c;我用Python”T恤衫的老哥)决心开发一个新的解释程序&#xff08;Python维形&#xff09;; 1991年&#xff0c;第一…

机器学习中的数学原理——向量内积

今天是2023年的第一天&#xff0c;祝大家新年快乐&#xff01;这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——…

【C语言】指针

文章目录指针作为参数的指针访问某个地址上的变量*指针的应用数组和指针数组变量是特殊的指针指针常量和常量指针数组指针和指针数组常见错误指针运算动态内存分配指针 一般用p来表示一个指针&#xff0c;来自pointer 一个指针类型的变量就是保存地址的变量。 变量的值是内存…

windows x32调用门实现 ring3提权

概述 调用门是Intel提供的一个机制&#xff0c;用于控制不同权限级(ring0-ring3)的程序函数调用。简单点就是提供了一个ring3 调用ring0 函数的机制。 在intel手册volume3-Chapter 5.83描述如下 Call gates facilitate controlled transfers of program control between dif…

算法笔记(25)win10系统安装tensorflow-GPU环境亲测好用

环境准备 首先你的电脑得有GPU显卡&#xff0c;然后在tensorflow官网&#xff08;在 Windows 环境中从源代码构建 | TensorFlow&#xff09;找到各安装软件对应的版本&#xff0c;版本不对应将会导致安装失败。 标本机GPU显卡版本题本文选择的是官网最新的组合&#xff1a;p…

cubeIDE开发, stm32窗口看门狗WWDG的CubeMX配置及HAL库底层实现分析

一、stm32的WWDG说明 1.1 WWDG特点&#xff1a; 在前一篇博文介绍独立看门狗时就指出STM32 MCU提供两个看门狗&#xff0c;独立看门狗和窗口看门狗。 cubeIDE开发&#xff0c; stm32独立看门狗IWDT的CubeMX配置及HAL库底层实现分析_py_free的博客-CSDN博客 相比独立看门狗&am…

【C语言】数据类型

文章目录c语言的类型整数整数类型整数的内部表达整数的范围unsigned整数的格式化浮点型浮点类型输入输出输出精度字符类型逃逸字符类型转换自动类型转换强制类型转换逻辑类型bool逻辑运算条件运算符C语言的变量&#xff0c;必须在使用前定义&#xff0c;并且确定类型&#xff1…