Linux:进程终止和等待

news2024/11/16 20:58:04

一、进程终止

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.coloradmin.cn/o/1574936.html

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

相关文章

探索7个MAMP本地开发环境的高效替代软件

什么是本地开发环境 本地开发环境是Web开发环境中的一种类型&#xff0c;它是指开发者自己的计算机上配置的一套用于开发和测试网站或应用程序的软件集合。这套环境使得开发者可以在本地计算机上构建和测试网站&#xff0c;而无需实时部署到服务器。 创建本地开发环境有两种方…

Python实现【坦克大战】+源码分享

写在前面&#xff1a; 坦克大战&#xff0c;这款经典的电子游戏&#xff0c;无疑是许多80后和90后心中不可磨灭的童年记忆。它不仅仅是一款游戏&#xff0c;更是那个时代科技娱乐方式的缩影&#xff0c;见证了电子游戏行业的起步与发展。 在那个电脑和网络尚未完全普及的年代…

云备份day04

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容介绍了文件工具了类的实现 文章目录 云备份day041.文件…

00-armv8/armv9中断系列详解-序言

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 1、序言 带着问题去学习&#xff0c;关于异常/中断的一些思考: (1)、在如下的一个大系统种&#xff0c;cpu正在optee os中运行&#xff0c;突然来了一个想给Linux Kernel处理的中…

JS与Python函数在语法的区别

区别 标题语法&#xff1a;Python使用缩进来表示代码块&#xff0c;而JavaScript使用大括号{}。 Python函数定义&#xff1a; def my_function():# 函数体JavaScript函数定义&#xff1a; function myFunction() {// 函数体 }标题参数传递&#xff1a;Python支持位置参数、…

海外代理IP购买指南:住宅IP代理VS.数据中心代理IP

在选择海外IP代理服务时&#xff0c;您将面临一个关键的问题&#xff1a;是选择住宅代理IP还是数据中心代理IP&#xff1f;这两者之间存在着根本性的不同&#xff0c;涉及到性能、隐私和成本等方面的考虑。住宅代理IP通常来自真实的住宅网络连接&#xff0c;更难被检测到。数据…

【蓝桥杯-读数据】

蓝桥杯-读数据 P8598 [蓝桥杯 2013 省 AB] 错误票据 P8598 [蓝桥杯 2013 省 AB] 错误票据 这道题本身很简单&#xff0c;最大的难点在于读入数据。 #include<bits/stdc.h> using namespace std; #define int long long const int N 2e5 10; int a[N]; signed main()…

Bigtable [OSDI‘06] 论文阅读笔记

原论文&#xff1a;Bigtable: A Distributed Storage System for Structured Data (OSDI’06) 1. Introduction Bigtable 是一种用于管理结构化数据的分布式存储系统&#xff0c;可扩展到非常大的规模&#xff1a;数千台服务器上的数据量可达 PB 级别&#xff0c;同时保证可靠…

如何明确的选择IT方向?

一、明确目标 作为初学者&#xff0c;先树立自己目标&#xff0c;找到自己感兴趣的IT行业&#xff0c;IT行业分很多种&#xff0c;听的最多次的无非不就是web前端工、程序员、后端、大数据、网络运维等。学习知识也是为了找到更好的工作&#xff0c;所以我建议先去boss直聘、五…

xshell7连接ubuntu18.04

&#x1f3a1;导航小助手&#x1f3a1; 1.查看ubuntu IP2.开启openssh-server3.静态IP设置4.Xshell连接 1.查看ubuntu IP 输入下面命令查看IP ifconfig -a可以看到网卡是ens33&#xff0c;IP为192.168.3.180。 2.开启openssh-server 1、执行下句&#xff0c;下载SSH服务 s…

【AI+视频】只要一张图片就能生成跳舞视频的几种方案

今天下班休闲之余刷了会D音&#xff0c; 接连刷到美女跳舞的几个视频。 仔细一看&#xff0c;这些不都是AI制作的么。 前几天写过一篇关于 【AI视频】pixverse一款免费的文生视频、图生视频工具&#xff0c; 这里介绍 图片生成跳舞视频 的 几种方案。 写这个的主要原因&…

PPP-B2b星历下载

目前做PPP-B2b研究比较多&#xff0c;其中PPP-B2b需要北斗的CNAV星历下载链接为&#xff08;例如2024.04.05对应的2024年第097天&#xff09;&#xff1a;数据下载http://www.csno-tarc.cn/datacenter/ephemeris

传道难-授业更难-解惑难上加难

传道授业解惑 困境 工作所在地所遇到的事情&#xff0c;大部分并非缺少知识&#xff0c;也并非缺少努力&#xff0c;从某种角度上来看&#xff0c;其实是资源匮乏。 比如预算经费&#xff1a; 来源网络&#xff0c;需要可以自行查找。 但是很多学校的经费预算都不到两位数&a…

【LeetCode】894. 所有可能的真二叉树

文章目录 [894. 所有可能的真二叉树](https://leetcode.cn/problems/all-possible-full-binary-trees/)思路一&#xff1a;分治代码&#xff1a;思路二&#xff1a;记忆化搜索代码&#xff1a; 894. 所有可能的真二叉树 思路一&#xff1a;分治 1.递归&#xff0c;n1 时&#…

VM虚拟机部署code-server服务+tailscale内网穿透,实现随处coding

1.Linux下安装code-server Releases coder/code-server (github.com)https://github.com/coder/code-server/releases先去发布页面查看最新的code-server版本&#xff0c;下载命令示例&#xff1a; wget https://github.com/coder/code-server/releases/download/v4.22.1/co…

24考研-东南大学916经验贴

文章目录 一、个人情况二、初试备考经验1.政治 67&#xff0c;客观382.英语 60&#xff0c;客观大概40左右3.数学 136&#xff0c;客观应该满分4.专业课 数据结构计网 114小分不清楚 三、复试备考经验笔试&#xff1a;C面试复试流程 附一下成绩单&#xff1a; 一、个人情况 本…

【学习】注意力机制(Attention)和 自注意力机制(self-Attention)

参考B站&#xff1a;09 Transformer 之什么是注意力机制&#xff08;Attention&#xff09; 1. 注意力机制&#xff08;Attention&#xff09; 红色的是科学家们发现&#xff0c;如果给你一张这个图&#xff0c;你眼睛的重点会聚焦在红色区域 人–》看脸 文章看标题 段落看…

Maven插件打fatjar的一些技巧

前言 最近做项目&#xff0c;Java实际上一般情况也不用fatjar&#xff0c;毕竟CICD都是流水线构建&#xff0c;不过在预研的过程中&#xff0c;使用fatjar可以内置manifest的main类直接启动&#xff0c;就很方便&#xff0c;尤其是在服务器运行环境。实际上golang还是很方便的…

倒计时】2024年全国大学生英语竞赛(附ABCD类历年真题+答案解析+24押题卷

倒计时】2024年全国大学生英语竞赛&#xff08;附ABCD类历年真题答案解析24押题卷 全国大学生英语竞赛&#xff08;NECCS&#xff09;是我国目前规模较大、参与人数众多的全国性大学生英语综合能力竞赛&#xff0c;在我国大学英语教学改革不断发展和大学就业日趋严峻的形势下&a…

SpringCloud Alibaba Sentinel 规则持久化

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十七篇&#xff0c;即使用 Sentinel 实现规则持久化。 二、概述 从前面我们做的实验可知&#xff0c;…