【Linux】进程的终止,等待(不包含进程的程序替换)

news2024/11/25 4:31:58

信号的部分会在后面仔细讲,本文不涉及 

目录

1.进程终止以及退出码的理解

2.进程退出

3.进程等待 


1.进程终止以及退出码的理解

1.情况分类 

(1)正常执行完

a.结果正确 

b.结果不正确 反思为什么?

(2)运行中崩溃(进程异常)崩溃的本质:因为某些原因进程收到了来自操作系统的信号(比如kill-9)

之前我们写的main函数都会配return 0;这个数字0就是main函数进程的退出码

进程退出码:表征进程执行完结果是否正确,一般0表示成功,非零表示失败

因此退出码可供用户进行进程退出健康状态的判定

怎么提取退出码?

用这条指令 

那么退出码是什么我还不是很了解,但是我知道退出码是包含一定信息的,这个信息会具体告诉我们进程的退出状态,现在只知道0表示进程成功退出,其他的退出码怎么看?

首先我们要知道获取错误信息的函数

把错误码输入进去会获得错误信息字符串,其实我们在linux中经常看到函数调用的返回值都有一句话,错误代码存放在errno中(对应上面strerror函数的as if set to errno),那么退出码也是一种错误代码,可以用它读取错误信息,所以我们用这样的函数查看系统中的退出码

  

结果是

...

 

到134基本上就没有错误信息了,也就是系统的退出码其实也就133个

具体看一下 0 对应的是成功(正常退出),2对应的是没有当前你说的这个文件/目录

这个报错好熟悉的感觉诶~~~~~

演示一下(当前目录并没有tmp这个文件)

 !!!为什么感觉我没写代码,但是也能查到退出码?

因为你的指令ll就是一个进程,之前我们不是自己写过ll的,进程,指令,程序,这三个没什么区别的,所以只要是进程就有退出码,那么指令也有退出码

 

说到这我, 就可以先简单写一个程序看看退出码的获取 

exit肯定大家都不陌生,之前在写程序需要异常退出的时候经常写 exit(-1)

  发现确实获取到,但是再echo $? 怎么都是0

因为刚才说了,指令也有退出码,echo $?查的是最近一个程序的退出码,那第二次查的就是第一条echo $?的退出码,由于这条指令成功,所以退出码是0

既然系统有退出码,我们就可以自定义退出码

方式:写一张充满报错信息的表,然后给表中的字符串赋值

2.进程退出

  • 如何理解进程退出?

进程=内核数据结构+代码和数据

OS少了一个进程,就要释放进程对应的代码和数据(如果有独立的)

  • 都有哪些退出方式

1.main函数return 那其他函数return呢?仅代表该函数返回,进程执行的本质是main执行流执行

2.exit退出

可以用man查三号手册看到exit

 还有一个函数_exit 可以在2号手册查到

 这时候已经感觉到一点不对了

man 1:用户指令

man 2:系统调用

man 3: C库调用

我们更推荐的是exit,原因来看下面的代码

 这段代码使用了_exit但是没有我们手动刷新缓存区,但是一直到最后都没有刷新(因为运行之后的结果什么都没看到)

换成exit()

看到hello了

所以_exit和exit的区别自然体现

 

 那么我们猜测一下缓冲区在哪?

肯定不在操作系统内部,要是在的话,_exit也调用了系统接口,那么也能刷新缓冲区,这与事实不符,那就只剩用户层和C库了(以后我们会专门谈)

可以猜测exit()其实是对_exit的封装

这就回答了进程是如何退出的问题(即如何删除进程)

删除进程一定由操作系统完成,所以操作系统把接口提供给用户,exit调用这个接口完成删除


3.进程等待 

1.为什么要等待?

a.避免内存泄漏(目前一定要做)

b.获取子进程执行结果(如果必要)

这就引出了新的思考为什么要创建子进程?

因为有时候父进程想把一些任务分给别人做,同时自己可以做点别的事情,或者自己什么都不干(扣题 进程等待),所以我把任务交出去就需要知道我的子进程把事情办得好不好——获取子进程执行结果

执行结果有如下几种:

1.代码跑完结果对——>退出码

2.代码跑完结果不对--->退出码

3.代码运行异常——--->信号

所以这个过程中 退出码+信号 是最重要的

2.什么是等待?

通过系统调用获取子进程退出码或者退出信号的方式顺便释放内存问题(因为之前讲过退出码/信号中包含很多信息,获取他我们就能知道子进程完成的如何)

谁等?父进程

等谁?子进程

3.如何进程等待?

用wait/waitpid

man 2 wait  查到(2号手册是系统调用接口手册)

看这两个函数,参数是int *status——>输出型参数

也就是在wait/waitpid函数内部会获取到status的值最后函数调用结束得到status

那么以waitpid举例(他的参数更多,看懂他wait自己可看懂了)

明确我们想通过status获得什么?

子进程的退出码+信号

那么信号怎么查看?kill -l

 

发现信号也是整数

那么位图是什么?

举个例子:假设四个人吃饭,屋子里有八个椅子(有序),我们用1表示这个椅子上有人,那么八个椅子可以表示成 0111 0100 —— 这就可以成为位图

同样的权限也是一种位图(权限的八进制表示)

 也就是status的32位如下

其中core dump暂时不讲

 那么怎么分别获取退出状态和信号?位运算

获取信号——status & 0x7F

获取退出码——(status>>8) & 0xFF

 

  • 父进程如何获取子进程信息?

 

  • 父进程在wait时若子进程没退出,父进程在干什么?

  •  如果我们不想阻塞等待呢?也就是不想在waitpid卡住怎么办?

小故事:

你给一个人打电话他说他有事,你说让他先忙但是别挂电话

打电话就对应着系统调用waitpid,此时他没挂电话——阻塞式调用——结果有两个:好了/出错

第二天你还是找他有事,但是这次他说完有事就挂了,你一次一次打过去,他一次一次说还没好就挂——做了很多次状态检测——非阻塞式轮询 结果:好了/还没好/出错

  • 如何设置非阻塞轮询?

 

再加上return 0; 

 当然其实我们可以用宏判断进程是否退出正常还有查看进程的退出码

记忆方法都在图中加粗

当然父进程在非阻塞轮询的时候还可以干点别的(可以自己写写代码) 

还有后续:进程替换哦,关注不迷路

 

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

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

相关文章

CesiumForUnreal去掉左下角的Ion Logo

文章目录 1.实现目标2.实现过程3.参考资料1.实现目标 记录一下使用CesiumForUnreal插件过程中如何清除左下角的Cesium Ion Logo,清除前后的对比截图如下所示。 原始样式去除后2.实现过程 记录一下实现的过程(含踩坑记录,可能有一点啰嗦)。 (1)首先看一下是哪个蓝图添加的…

【STM32CubeMX】F103窗口看门狗

前言 本文记录了我学习STM32CubeMX的过程,方便以后回忆。我们使用的开发板是基于STM32F103C6T6的。本章记录了窗口看门狗的使用配置。要学习的话,注意流程一说,省略的内容。 基础 窗口看门狗(WWDG)属于APB1上外设。窗口看门狗(WWDG)的时钟源…

【小结】git合并分支总结

首先理清以下几个关系: 1、git有本地库和远程库。 ①本地仓库:也就是电脑上存储的代码,本地代码,一般在某个盘中。 ②远程仓库:是云上的库,比如gitee,github等等。 2、分支:分为本地分支和远…

手机摄影(三)

第七章 构图,用光与色彩 构图的原则: 画面简洁 突出主体 陪体和主体:如果没有枯叶做前景,画面的空间感和深秋氛围会大打折扣。 看到一张你认为很美的照片时,要问自己几个问题: • 这张照片的主体是什么…

jvm之启动参数

写在前面 本文一起看下jvm启动参数相关内容,通过本文希望我自己也希望大家能够真正的应用到实际的工作中。 1:基本内容介绍 一般我们启动java程序有两种方式,一种是直接运行一个有main函数的class,第二种是运行一个在MANIFEST文…

安装mysql

1、环境(虚拟机新安装的Redhat): 链接:https://pan.baidu.com/s/1jjdimuq-TrS8RASqGiU5Xg 提取码:2hef 2、检查系统是否已经安装了 MySQL rpm -aq | grep mysql 如果有旧版本就需要像下面卸载mariadb一样卸载掉。M…

希尔密码,云影密码 及例题

希尔密码 云影密码 题一 [HDCTF2023]–爬过小山去看云 题目描述: 密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne 在山的那头,有3个人,4只鸟,19只…

Keepalived概念与安装部署过程

前言 目前互联网上主流高可用方案软件有keepalived、heartbeat,其中heartbeat是比较早期用来实现高可用软件的,而keepalived是目前轻量级,并且管理方便、易使用的高可用解决方案。 1.1 Keeplived高可用的功能 Keepalived是一个类似于工作在…

半监督学习经典工作:边缘生成对抗网络(MarginGAN)

来源:投稿 作者:小灰灰 编辑:学姐 论文标题:MarginGAN: Adversarial Training in Semi-Supervised Learning 论文链接: https://papers.nips.cc/paper/2019/file/517f24c02e620d5a4dac1db388664a63-Paper.pdf 代码链接&#xf…

ShardingCore安装笔记

由于本人采用Visual Studio的nuget管理器安装ShardingCore经常出现网络错误的问题,所以采用离线包的方式安装插件。 nueget包下载地址:NuGet Gallery | ShardingCore 7.7.1.8 ShardingCore使用版本7.7.1.7 1、下载各种依赖文件,并存放到系…

openTCS分析

一、openTCS概览 1. openTCS操作流程 打开ModelEditor设置点、路线、装货卸货等信息并保存模型打开Kernel和KernelControlCenter在ModelEditor上传模型打开KernelControlCenter设置车辆信息打开OperationsDesk打开OperationsDesk设置小车模式为可利用,并创建订单 …

USB 断开检测

文章目录 USB 断开检测带 Vbus 检测功能的 USB 设备断开不带 Vbus 检测功能的 USB 设备断开USB 设备端断开的检测USB 主机端断开的检测低速/全速设备高速设备 USB 断开检测 USB 主机和 USB 设备同样需要具有检测断开的能力。 USB 主机如果不能检测到 USB 设备的移除将会导致其…

测试虚拟驱动vivi

测试虚拟驱动vivi 文章目录 测试虚拟驱动vivi安装xawtv方法1方法2测试USB摄像头 测试虚拟摄像头vivi1.确定ubuntu的内核版本2. 去www.kernel.org下载同版本的内核修改Makefile测试体验 安装xawtv 方法1 sudo apt-get install xawtv方法2 源码xawtv-3.95.tar.gz: http://www.…

「2023最新」「阿米洛 VARMILO」双模机械键盘使用指南(快捷键组合)

前言 在说明书找不到的时候却需要使用键盘的某些特性时查一下 以阿米洛 minilo 尤加利为例 主要快捷键组合 开机 2 秒内连续敲击空格键三下,数字 1 或 2 或 3 键灯闪烁,键盘开机重新配对 长按 5 秒 Fn Q / W / E 键 (分别对应数字 1 / 2…

《vector的一些OJ》

本文主利用我们的vector来解决一些OJ题 前三个题目很类似,分别为 一个数字只出现一次,其他数字都出现两次两个数字只出现一次,其他数字都出现两次一个数字只出现一次,其他数字都出现三次 文章目录 1、[一个只出现一次的数字&#…

vue3:自定义指令

一、理解vue指令 1.1、指令 在 vue 中提供了一些对于页面和数据更为方便的输出&#xff0c;这些操作就叫做指令&#xff0c;以 v-xxx 表示&#xff0c;比如 html 页面中的属性 <div v-xxx ></div>。自定义指令很大程度提高了开发效率&#xff0c;提高了工程化水平…

Makefile基础教程(伪目标)

文章目录 前言一、伪目标概念二、进一步了解伪目标三、不使用.PHONY来定义伪目标总结 前言 本篇文章将讲解Makefile中的伪目标&#xff0c;Makefile的目标在前面的文章中我们已经讲解了那么这篇文章我们就来讲讲伪目标。 一、伪目标概念 Makefile 伪目标是一类特殊的目标&am…

手机摄影(四)

第8章 人物拍摄 平拍显亲切 如果侧拍好看&#xff0c;可以选择 局部自拍表现神秘&#xff08;比如嘴唇&#xff0c;眼睛&#xff0c;锁骨&#xff0c;要足够惊艳&#xff09; 技巧&#xff1a; 简单背景适合人像和镜子回头&#xff08;幅度不能太大&#xff09;小清新&…

《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》论文精读

Abstract 我们提出了一种方法&#xff0c;通过使用稀疏的输入视图集优化底层连续体场景函数&#xff0c;实现了合成复杂场景新视图的最先进结果。我们的算法使用全连接(非卷积)深度网络表示场景&#xff0c;其输入是单个连续的5D坐标(空间位置(x, y, z)和观看方向(θ&#xff…

C++系列五:输入/输出

C输入输出 1. 输入2. 输出3. 格式化输出4. 总结 1. 输入 输入是指从外部源获得数据的过程&#xff0c; C中可通过键盘或文件等外部源来获取输入数据。 &#xff08;1&#xff09;cin cin是C标准库中的一个输入流对象&#xff0c;用于从标准输入设备&#xff08;通常是键盘&a…