Linux:进程终止和等待

一、进程终止

main函数的返回值也叫做进程的退出码,一般0表示成功,非零表示失败。我们也可以用不同的数字来表示不同失败的原因。

echo $?//打印最近一次进程执行的退出码

而作为程序猿,我们更需要知道的是错误码所代表的错误信息,转化方法有以下两种:

1.使用语言和系统自带的方法进行转化

2.自定义

 strerror

799efac7f53b4087b58c77a73a77e7dc.png

 0cfee89e9f1648229f913b1a2842c84c.png

 5bfc2a2746494beb937180042b51241e.png

 所以进程代码执行情况大致可以分为正确、不正确、或者代码没有执行完,进程出异常了。

所以我们判断进程最终的执行结果先要判断它是否出异常没有执行完,然后才能判断是否退出的结果正确与否。

 进程退出是收到了异常信号。

7fa35a4cf8f44b80883cdb6ebd3a00df.png

不同的信号编号表明进程异常的原因。

任何进程最终的执行情况,我们可以使用两个数字表明具体的执行情况。

81c1ffc0f6c4444593b8985e1d36aaa6.png

第一种情况就表明没有异常结果正确

第二种第四种都表示进程出异常

第三种表示退出结果不正确。

exit

我们也可以通过exit直接终止进程,status表示退出码。

f8a9e35f5ad64783b821f4f8e6a8c932.png

在我们进程中,任意地方调用都可以实现进程退出。

5e7db97d4de94b60b9e9bd219ab6575a.png

_exit和exit的区别就是exit支持刷新缓冲区,_exit不支持。而终止进程是只有操作系统才可以办到的事情,exit作为库函数内部是封装了系统调用_exit 。而例如scanf和printf也是如此,内部都封装了系统调用。经过封装后,语言的可移植性和跨平台性都可以得到提升。

exit最后也会调用_ exit, 但在调用_exit之前,还做了其他工作:
1. 执行用户通过 atexit或on_exit定义的清理函数。
2. 关闭所有打开的流,所有的缓存数据均被写入
3. 调用_exit

8b7fb67b53e7469386d7c5e399c1163e.png

二、进程等待

2.1进程等待的必要性

之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存漏。
另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
所以为什么要进行进程等待?
1.获取子进程的退出码和异常信息(即退出信息)。
2.父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。
6d90748c9f3e452eb57654f7dcc998dd.png

2.2进程等待的方法

wait方法

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);
返回值:成功返回被等待进程pid,失败返回-1。
参数:输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

 wait在等待时默认进行阻塞等待。

任意等待一个子进程。

在进程中父进程要进行最后退出,因为它需要进行代码回收。

waitpid 方法
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:当正常返回的时候waitpid返回收集到的子进程的进程ID;如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:pid:Pid=-1,等待任一个子进程。与wait等效。Pid>0.等待其进程ID与pid相等的子进程。status:WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)options:WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进
程的ID。

fb0b35e9a6cb4236854e6e2da30a1ba1.png

49e58f5223654c47b6e406ca79e75b4b.png 79968f1ec4194410adb9c35393f26a08.png

可经过编译后才发现最后status是256而不是1.

这是因为status并不是一个单纯的四字节整数,因为status中需要存放两个数字:1.退出码2、退出信号,所以status有自己的格式。我们只考虑它的低16位。

a91650d5294d44119e6cc95f4f492157.png

1e86ee141a5f4ba393fe6b00b877bf06.png

 任何进程的最终执行情况,我们可以使用两个数字表明具体执行的情况

而刚刚的写法导致最终status中存储如下图的内容即256

8348f88270e34f71b3b000353782f264.png

3.3wait_pid的非阻塞等待方式

 ded5007283814f16aeb9004ab76b235f.png

依旧是上文中的代码,父进程除了进行阻塞等待,还可以进行非阻塞等待

af0d71e6b23e4f16a6c29dffb1cad84d.png

而非阻塞状态下,需要去反复查询子进程状态,是一种基于非阻塞的轮询访问。优点是在当调用wait_pid去轮询期间,父进程可以去继续执行其他代码,而不是一直处于阻塞状态去等待。

根据上图代码和wait_pid的用法,可以将父进程部分代码改为非阻塞状态的写法。

f31b771ed8af416cb595a1b5b631728d.png

71beb8e982814ad08bec9e45f99af4e4.png

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

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

相关文章

【信号与系统 - 2】傅里叶变换与反变换

1 傅里叶变换与频谱密度函数 非周期信号可以看成是 T → ∞ T\to{\infty} T→∞ 的周期信号 由于 w ↓ 2 π T ↑ w\downarrow\frac{2\pi}{T\uparrow} w↓T↑2π​&#xff0c; T T T 无限大&#xff0c;则基波频率 w w w 无限小&#xff0c;可以视为 d w dw dw 在频谱图…

电工技术学习笔记——直流电路及其分析方法

一、直流电路 电路的组成 1. 电压和电流的参考方向 电压&#xff08;Voltage&#xff09;&#xff1a;电压是电场力对电荷产生的作用&#xff0c;表示为电荷单位正电荷所具有的能量。在电路中&#xff0c;电压通常被定义为两点之间的电势差&#xff0c;具有方向性&#xff0c;…

HomePlug AV

目录 HomePlug AV的基本概念基本术语网络概念网络实例 HomePlug AV物理层&#xff08;PHY&#xff09;HomePlug AV OFDM收发器架构PHY的调制模式FC调制和ROBO调制物理层的特点OFDM频域/时域转换开窗/槽式OFDM信号和噪声PHY发送控制——信道自适应PHY帧格式&#xff08;Symbol&a…

中间件复习之-RPC框架

什么是RPC框架&#xff1f; RPC(Remote Procedure Call):远程过程调用。当多个应用部署在多个服务器上时&#xff0c;由于他们不在一个内存空间上&#xff0c;因此需要网络来进行通信&#xff0c;而RPC允许它像调用本地方法一样调用远程服务。 RPC原理 服务消费方通过RPC客户…

Unity类银河恶魔城学习记录12-3 p125 Limit Inventory Slots源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Inventory.cs using Newtonsoft.Json.Linq; using System.Collections; us…

【面试八股总结】进程(一)

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 一、什么是进程&#xff1f; 1. 基本概念 进程是具有独立功能的程序在一个数据集合上运行的过程&#xff0c;是系统进行资源分配和调度的一个独立单位。 2. 进程控制块 系统通过进程控制块PCB描述进程的进本情况…

20.2k stars项目搭建私人网盘界面美功能全

Nextcloud是一套用于创建网络硬盘的客户端&#xff0d;服务器软件。其功能与Dropbox相近&#xff0c;但Nextcloud是自由及开放源代码软件&#xff0c;每个人都可以在私人服务器上安装并执行它。 GitHub数据 20.2k stars561 watching3.2k forks 开源地址:https://github.com/ne…

利用Python将TXT文件中的经纬度数据转换为JSON格式

在处理地理空间数据时&#xff0c;经常需要将数据从一种格式转换为另一种格式&#xff0c;以便于后续的分析或可视化。本文将介绍如何使用Python脚本将存储在TXT文件中的经纬度数据转换为JSON格式。 一、背景介绍 经纬度数据是地理信息系统&#xff08;GIS&#xff09;中的基…

Redis 全景图(3)--- Redis 应用于缓存

前言 这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流&#xff0c;我也是没办法&#xff0c;才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。 其实为什么要讲这个话题呢&#xff1f; Redis 应用在很多地方呀&#xff0c;为什么一定要挑着这个话题来讲呢…

如何从屏幕破损的 Android 手机恢复数据?

假设您不小心将智能手机掉落在地上&#xff0c;导致手机显示屏破裂&#xff1b;或者&#xff0c;如果Android手机由于日常生活中的病毒攻击等其他原因而损坏或死机&#xff0c;如何从损坏的Android手机中完全提取保存的联系人、消息甚至更多文件&#xff1f;如何在手机上恢复所…

使用 Prisma ORM 和 Cloudflare D1 构建应用程序

自 2017 年推出 Workers 以来&#xff0c;Cloudflare 一直引领边缘计算领域。Cloudflare 最近通过 D1 发布了本机无服务器数据库。我们现在可以使用 Prisma ORM 与 D1 一起构建应用程序。 将数据库部署到边缘 Cloudflare Workers 是一种分布在全球范围内的轻量级无服务器计算形…

Centos7安装Docker与Docker-compose【图文教程】

个人记录 查看一下系统是否已经安装了Docker yum list installed | grep docker如下图代表没有安装Docker 卸载已有Docker yum remove docker docker-common docker-selinux docker-engine切换目录 cd /etc/yum.repos.d/查看当前目录所有的镜像源 ll安装yum-util与devi…

基于springboot实现影城管理系统项目【项目源码+论文说明】

基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…

C语言-realloc函数的使用

语法格式 1. realloc 函数用于动态地改变之前分配的内存块的大小。其函数原型如下&#xff1a; void *realloc(void *ptr, size_t size);- ptr: 指向之前分配的内存块的指针。如果 ptr 为 NULL&#xff0c;那么 realloc 行为与 malloc 相同。 - size: 新分配的大小&#xff0…

前端三剑客 —— CSS (上)

上节内容中提到了 前端三剑客 —— HTML 超文本标记语言&#xff0c;这节内容 跟大家讲述三剑客中的第二个 CSS。 CSS 什么是CSS Cascading Style Sheel&#xff0c;简称CSS&#xff0c;中文叫层叠样式表&#xff0c;也叫级联样式表。主要作用是来修饰HTML页面的一种技术。 …

案例:非功能性需求的设计

在咨询中看到很多项目组对于非功能性需求没有做设计&#xff0c;很多项目组在设计文档中仅仅是把非功能性需求的描述拷贝到设计文档的非功能性章节。因此特地设计了两个简单的需求给大家参考&#xff0c;希望能够引导设计人员重视非功能性需求的设计。

视觉大模型--deter的深入理解

但对于transformer用于目标检测领域的开创性模型&#xff0c;该模型言简意赅&#xff0c;但是但从论文理解&#xff0c;有很多细节都不清楚&#xff0c;尤其是解码器的query和二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)相关&#xff0c;本文将根据代码详…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中&#xff0c;我们实现了Tag和InputAction的数据对应&#xff0c;后面&#xff0c;我们会通过InputAction触发对应的Tag&#xff0c;然后在GameplayAbility身上设置对应的Tag&#xff0c;然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

精读 Generating Mammography Reports from Multi-view Mammograms with BERT

精读&#xff08;非常推荐&#xff09; Generating Mammography Reports from Multi-view Mammograms with BERT&#xff08;上&#xff09; 这里的作者有个叫 Ilya 的吓坏我了 1. Abstract Writing mammography reports can be errorprone and time-consuming for radiolog…

基于单片机的数字万用表设计

**单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…