进程控制(一):进程终止

news2024/11/16 7:23:28

文章目录

  • 进程控制(一)
  • 进程终止
    • 运行正常
      • 退出码
    • 运行异常
    • 进程正常/异常总结


进程控制(一)

在前文中,我们初步了解了进程的概念,以及通过fork函数来创建子进程,并对于为什么运行一个程序,只要fork就会有两个进程分别执行不同的代码部分,了解了父子进程公用同一代码以及数据。

下面我们进一步了解进程,初步认识之后,就要深入探讨,如何对于控制进程。

进程终止

进程终止的方式有三种:

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常,终止程序

对于上述三种情况,我们分别进行考虑,总体上依据是否运行完毕分为两类,运行正常以及运行异常终止。

运行正常

运行正常,分为两种,结果正确/结果不正确,对于运行结果是否正确,我们引入了退出码这一概念。

退出码

退出码是指在运行一个程序(进程)之后返回的一个int类型的数字,比如main函数中,我们常用的return 0;表示的就是返回0,0即为退出码,表示该程序结果运行正常,结果正确,其他数字表示结果不正确,退出码是正整数

正常终止进程

  • 从main函数通过return返回
  • 调用exit
  • 调用_exit

exit函数

exit函数的调用,可以使得进程直接终止,并返回其参数,使用格式为exit(int)

echo $?可以得到最近一次进程的退出码

status 定义了进程的终止状态,父进程通过wait来获取该值

//exit函数
//#include<unistd.h>  在unistd.h库中
//void exit(int status);  其中status表示状态码,状态码有八位可以被父进程所使用,如执行exit(-1) 
//echo $?  得到结果为255
#include<unistd.h>
#include<iostream>
using namespace std;
void func()
{
	cout << "Hello World!" << endl;
	exit(1);//此时,结束func函数,返回到main函数
	cout << "Hello World!" << endl;
}
int main()
{
	func();
	return 0;
}//main函数和func函数运行,实际上可以认为是两个进程在运行,main好比是func函数的父进程,func通过exit终止程序,返回码为1,交给main函数

在这里插入图片描述

_exit函数

_exit函数和exit函数的差别不大,exit的执行最终也会调用_exit,在此之前先执行以下几个方面:

  1. 执行用户定义的清理函数
  2. 冲刷缓冲区,关闭流
  3. 执行_exit函数

在这里插入图片描述

上述内容说明,_exit为系统调用接口,是直接对于操作系统内核进行操作,不会冲刷缓冲区,说明缓冲区一定不在内核中,不然_exit也会冲刷缓冲区。

在这里插入图片描述

return

return是最为常见的一种退出进程的方法,执行return n相当于exit(n),main函数执行完毕后,会将返回值作为exit的参数退出进程。

#include<iostream>
using namespace std;

int main()
{
	//执行程序之后,运行到下面阶段
	return 0;//返回0,0为退出码,表示结果正常
}
  1. 如果是我们自己为了做题,或者学习的话,退出码不需要处理,那就任意退出码都可以
  2. 当在项目中,我们需要使用到父子进程时,在子进程结束后进入僵尸状态(Z)需要父进程来接收子进程的信息,其中就有退出码,用来表示程序是否正常运行。
  3. main函数的返回值,本质上是指进程运行完成时,是否是正确的结果,如果不是,可以使用不同的数字,来表示不同的出错码。

**main函数return返回,说明进程正常终止,这也是为什么在初学c/c++时,main函数默认return 0 **

运行异常

运行异常,表现为进程在运行时崩溃,中途终止进程,显示异常信息,如除零异常,没有查找到文件异常

比如使用cat func命令,如果当前目录下没有func目录或者文件,会显示异常

在这里插入图片描述

上图表示为,没有找到func文件或者目录,这是一种异常信息

对于进程的终止,如何杀死进程,我们了解kill -9(九号信号)来进行杀死进程,来控制进程,所以我们可以知道,实际上进程异常是运行程序后,检测到异常,然后操作系统通过kill命令发射相应的信号,来显示报错信息,以及结束进程。

通过kill -l命令可以显示所有信号

在这里插入图片描述

进程正常/异常总结

  1. 进程正常运行,会有两种情况,结果正确/不正确,正确结果不用管,但是为什么会出现不正确的结果,又如何去知道不正确的原因呢?
  2. 通过退出码的形式来表示结果正确/不正确,0表示结果正确,其他数字表示为结果不正确,不同数字对应不同的错误信息(错误原因)
  3. 代码终止,即代码异常,本质上是代码并没有跑完,中途崩溃,那么这样就不会经过退出码,直接就崩溃了,如何显示异常信息呢?
  4. 异常就不会有退出码,也就是说,如果程序异常就不需要考虑退出码,且异常的本质是进程收到了对应的信号,在kill -l命令中,我们可以看到所有的信息,进程异常会将对应的信号存储下来,供父进程接收。

上述提到的退出码以及异常信号,都会作为信息,被父进程回收处理。

退出码,在系统中有对应的一套体系,通过strerror(int)函数来得到对应退出码表示的信息

#include<iostream>
using namespace std;
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        //模拟实现错误信息的输出
        for(int i=0;i<200;i++)
        {
                printf("%d: %s\n",i,strerror(i));
        }
        return 0;
}

在这里插入图片描述

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

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

相关文章

虹科分享 | 买车无忧?AR带来全新体验!

文章来源&#xff1a;虹科数字化与AR 阅读原文&#xff1a;https://mp.weixin.qq.com/s/XsUFCTsiI4bkEMBHcGUT7w 新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0…

Banana Pi BPI-W3(ArmSoM-W3) RK3588编解码之MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 同芯片的差异&#xff0c;为使用者…

提取存档提取操作没有完成出现意外错误,导致无法提取存档。错误Ox8007000E:内存资源不足,无法完成此操作。若要关闭此向导,请单击“完成“”。完成(F)

提取存档 提取操作没有完成 出现意外错误&#xff0c;导致无法提取存档。 错误Ox8007000E:内存资源不足&#xff0c;无法完成此操作。 若要关闭此向导&#xff0c;请单击"完成"”。完成(F) 取消 当我们解压一个普普通通的压缩包时&…

针对公网IP签发的IP地址SSL证书

传统的SSL证书是基于域名的&#xff0c;通常用于保护特定网站的通信。但随着技术的不断演进&#xff0c;一些情况需要更广泛的安全性&#xff0c;这就是IP地址SSL证书出现的原因。IP地址SSL证书是专门为公网IP地址签发的SSL证书&#xff0c;而不是针对特定域名。这意味着您可以…

CG Magic分享3dmax软件安装与打开文件转圈圈怎么办?

大家使用3dmax软件时&#xff0c;尤其&#xff0c;是初学者无论是安装3dmax软件还是打开max文件时&#xff0c;会遇到一类问题&#xff1a; 3dmax一直转圈不动&#xff1f; 3dmax总是转圈怎么办 大家遇到3dmax一直转圈圈是如何解决的呢&#xff1f;小编这里整理了一些3dmax软…

【科普知识】什么是模拟量控制?

模拟量控制是一种通过模拟量输入信号来控制伺服电机转矩或速度的方法。通过调整输入信号的大小&#xff0c;可以实现对电机转矩、速度或位置的精确控制。 在伺服运动控制中&#xff0c;大家可能经常听到“位置控制”&#xff0c;“速度控制”&#xff0c;“模拟量控制”等词。前…

电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计

电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计 0、基本理论 参考-Design of Ultra Wideband Power Transfer Networks的4.17小节的推导过程 n 次切比雪夫多项式定义为&#xff1a; n在1到5时的切比雪夫多项式表&#xff1a; 此表可以使用下面的代码计算得出&…

java通过jol-core库分析对象内存分布以及查看Synchronized锁升级过程

在Java开发中&#xff0c;我们可以借助jol-core这个库来查看对象内存信息。 引入依赖&#xff1a; <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.17</version> </dependency>…

深度学习系列52:多目标跟踪

1. 评价指标 1&#xff09;FP&#xff1a;False Positive&#xff0c;即真实情况中没有&#xff0c;但跟踪算法误检出有目标存在。 2&#xff09;FN&#xff1a;False Negative&#xff0c;即真实情况中有&#xff0c;但跟踪算法漏检了。 3&#xff09;IDS&#xff1a;ID Sw…

【数据结构】数组和字符串(六):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏列(Compressed Sparse Column,CSC)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行&#xff08;Compressed Sparse Row&#xff0c;CSR&#xff09;矩阵f. 压缩稀疏列&#xff08;Compressed Sparse …

【计算机毕设小程序案例】基于微信小程序的图书馆座位预定系统

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 &#x1f449;IT源码社-SpringBoot优质案例推荐&#x1f448; &#x1f449;IT源码社-小程序优质案例…

Android拖放startDragAndDrop拖拽onDrawShadow动态添加View,Kotlin(3)

Android拖放startDragAndDrop拖拽onDrawShadow动态添加View&#xff0c;Kotlin&#xff08;3&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.…

【linux】麒麟v10安装Redis主从集群(ARM架构)

安装redis单示例的请看&#xff1a;麒麟v10安装Redis&#xff08;ARM架构&#xff09; 安装环境 ​Hostname​IP addressmaster192.168.0.1slave1192.168.0.2slave2192.168.0.3 下载安装包 &#xff08;三台都操作&#xff09; wget https://repo.huaweicloud.com/kunpeng/…

iStat Menus v6.72

iStat Menus是一款Mac电脑上的系统监控工具&#xff0c;它可以帮助用户监测电脑的硬件和软件状况&#xff0c;提供实时的系统数据和统计信息。 其主要特点包括&#xff1a; 1.系统监测&#xff1a;iStat Menus可以监测CPU、内存、硬盘、网络、电池等系统参数&#xff0c;方便…

SLAM从入门到精通(lidar的运动畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;很多时候传感器的数据并不能直接拿过来使用。这里面除了噪声的原因之外&#xff0c;另外一部分原因就是传感器数据本身也…

Linux 多架构支持介绍和实践

Linux 多架构支持介绍和实践 1. Linux 上多架构支持指的是什么意思&#xff1f; 在Linux 上开启多架构支持&#xff08;multi-arch support&#xff09;&#xff0c;指的是可以让您在同一系统上安装多个不同架构的软件包&#xff0c;这在交叉编译的场景显得格外重要。 以下实…

分享一下怎么做一个微信抽奖活动

抽奖活动是当今社会中非常流行的一种营销方式&#xff0c;它能够有效地吸引消费者的注意力&#xff0c;提高品牌知名度和销售额。在举办抽奖活动时&#xff0c;需要制定相应的规则和奖励设置&#xff0c;以确保活动的公平性和吸引力。本文将详细介绍如何制作一个有效的抽奖活动…

外汇天眼:如何有效地交易外汇?15个基本提示!

外汇是买卖货币的行为。日均交易量超过6万亿美元&#xff0c;是世界上最大的金融市场。鉴于其规模和可及性&#xff0c;许多人被高回报的承诺所吸引。但是&#xff0c;如果没有适当的知识和纪律&#xff0c;交易可能会有风险。在本文中&#xff0c;很好地分解了有效交易外汇的基…

2023高频前端面试题-浏览器

1. 浏览器是如何解析 CSS 选择器的&#xff1f; 在生成渲染树的过程中&#xff0c;渲染引擎会根据选择器提供的信息来遍历 DOM 树&#xff0c;找到对应的 DOM 节点后将样式规则附加到上面。 来看一段样式选择器代码、以及一段要应用样式的 HTML&#xff1a; .mod-nav h3 spa…

AI口语APP第三方接口

AI口语练习应用程序通常可以通过第三方接口来集成语音识别、自然语言处理和其他相关功能。以下是一些常见的第三方接口及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Google Cloud Speech…