进程控制(一):进程终止
文章目录
- 进程控制(一)
- 进程终止
- 运行正常
- 退出码
- 运行异常
- 进程正常/异常总结
进程控制(一)
在前文中,我们初步了解了进程的概念,以及通过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,在此之前先执行以下几个方面:
- 执行用户定义的清理函数
- 冲刷缓冲区,关闭流
- 执行_exit函数

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

return
return是最为常见的一种退出进程的方法,执行return n相当于exit(n),main函数执行完毕后,会将返回值作为exit的参数退出进程。
#include<iostream>
using namespace std;int main()
{//执行程序之后,运行到下面阶段return 0;//返回0,0为退出码,表示结果正常
}
- 如果是我们自己为了做题,或者学习的话,退出码不需要处理,那就任意退出码都可以
- 当在项目中,我们需要使用到父子进程时,在子进程结束后进入僵尸状态(Z)需要父进程来接收子进程的信息,其中就有退出码,用来表示程序是否正常运行。
- main函数的返回值,本质上是指进程运行完成时,是否是正确的结果,如果不是,可以使用不同的数字,来表示不同的出错码。
**main函数return返回,说明进程正常终止,这也是为什么在初学c/c++时,main函数默认return 0 **
运行异常
运行异常,表现为进程在运行时崩溃,中途终止进程,显示异常信息,如除零异常,没有查找到文件异常
比如使用cat func命令,如果当前目录下没有func目录或者文件,会显示异常

上图表示为,没有找到func文件或者目录,这是一种异常信息
对于进程的终止,如何杀死进程,我们了解kill -9(九号信号)来进行杀死进程,来控制进程,所以我们可以知道,实际上进程异常是运行程序后,检测到异常,然后操作系统通过kill命令发射相应的信号,来显示报错信息,以及结束进程。
通过kill -l命令可以显示所有信号

进程正常/异常总结
- 进程正常运行,会有两种情况,结果正确/不正确,正确结果不用管,但是为什么会出现不正确的结果,又如何去知道不正确的原因呢?
- 通过退出码的形式来表示结果正确/不正确,0表示结果正确,其他数字表示为结果不正确,不同数字对应不同的错误信息(错误原因)
- 代码终止,即代码异常,本质上是代码并没有跑完,中途崩溃,那么这样就不会经过退出码,直接就崩溃了,如何显示异常信息呢?
- 异常就不会有退出码,也就是说,如果程序异常就不需要考虑退出码,且异常的本质是进程收到了对应的信号,在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;
}

相关文章:
进程控制(一):进程终止
文章目录 进程控制(一)进程终止运行正常退出码 运行异常进程正常/异常总结 进程控制(一) 在前文中,我们初步了解了进程的概念,以及通过fork函数来创建子进程,并对于为什么运行一个程序…...
特殊类设计[下] --- 单例模式
文章目录 5.只能创建一个对象的类5.1设计模式[2.5 万字详解:23 种设计模式](https://zhuanlan.zhihu.com/p/433152245)5.2单例模式1.饿汉模式1.懒汉模式 6.饿汉模式7.懒汉模式7.1饿汉模式优缺点:7.2懒汉模式1.线程安全问题2.单例对象的析构问题 8.整体代码9.C11后可…...
计算机网络-应用层(1)
一、DNS 域名系统 (DNS) 是把主机域名解析为IP地址的系统。该系统是由解析器和域名服务器组成的。采用UDP 协议,较少情况下使用TCP 协议,端口号均为53。 域名系统由三部分构成: DNS 名字空间、域名服务器、 DNS客户机。 (1)根域:…...
Kotlin基础——枚举、When、in、for
枚举 声明只有值的枚举 enum class Color {RED, GREEN, BLUE }此外还可以增加属性和方法,如果需要在枚举类中定义方法,要使用分号把枚举常量列表和方法定义分开,这也是Kotlin唯一必须使用分号的地方 enum class Color(val r: Int, val g: …...
C++编程题目------平面上的最接近点对(分治算法)
题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 输入格式 第一行一个整数 n,表示点的个数。 接下来 n 行,每行两个实数 x,y ,表示一个点的行…...
Linux下的文件操作和文件管理
文章目录 应用编程文件操作文件描述符open函数write函数read函数close函数lseek函数文件操作例子 文件管理文件基本知识文件类型文件共享空洞文件错误处理退出程序原子操作fcntl和ioctl截断文件stat函数软链接和硬链接 应用编程 系统调用(system call)是Linux内核提供给应用层…...
设计模式之桥梁模式
什么是桥梁模式 桥梁模式(Bridge Pattern)也称为桥接模式,属于结构型模式,它主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥梁模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变…...
“从部署到优化,打造高效会议管理系统“
目录 引言一、部署单机项目 - 会议OA1.1 硬件和软件环境准备1.2 检查项目1.3 系统部署1.后端部署 二、部署前后端分离项目 - SPA项目后端部署2.前端部署 总结 引言 在现代化办公环境中,会议是组织沟通、决策和合作的重要方式之一。为了提高会议的效率和质量&#x…...
Facebook广告效果数据获取
一、背景 公司每年在Facebook和Google上投放了大量的广告,我总不能让老板登录Facebook广告投放平台上去看广告效果,其实老板只关注每天花了多少钱引来了多少客户,每个客户平均花费多少钱,其它的他才不关心,有Facebook…...
nlp之文本转向量
文章目录 代码代码解读 代码 from tensorflow.keras.preprocessing.text import Tokenizer # 标记器(每一个词,以我们的数值做映射,)words [LaoWang has a Wechat account., He is not a nice person., Be careful.] # 把这句话中每一个单词…...
【luckfox】添加压力传感器hx711
文章目录 前言一、参考资料二、电路图三、驱动四、makefile——添加驱动五、dts——使能gpio5.1 参考5.2 改动1—— hx117节点5.3 改动2——引脚节点5.4 已经被定义的引脚5.5 gpio源码 六、改动总结——使能hx711七、验证驱动添加八、编写测试文件8.1 测试代码8.2 配置编译环境…...
C++11的lambda表达式
lambda来源于函数式编程的概念。C11这次终于把lambda加进来了。 lambda表达式有如下优点: 1、声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护…...
矩阵特征值与特征向量的理解
各位朋友大家好,我是小C哈哈哈,很高兴认识大家,在这里,我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家,希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…...
云原生安全:如何保护云上应用不受攻击
文章目录 云原生安全的概念1. 多层次的安全性2. 自动化安全3. 容器安全4. 持续监控5. 合规性 云原生安全的关键挑战1. 无边界的环境2. 动态性3. 多云环境4. 容器化应用程序5. API和微服务 如何保护云上应用不受攻击1. 身份验证和访问控制示例代码: 2. 数据加密示例代…...
如何在用pip配置文件设置HTTP爬虫IP
首先,定义问题:在 Pip 中设置HTTP爬虫IP服务器,以便在网络上进行访问和下载。 亲身经验:我曾经遇到过类似问题,通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证:根据 pip 官方文档ÿ…...
2023MathorCup高校数模挑战赛B题完整解题代码教程
赛道 B: 电商零售商家需求预测及库存优化问题 问题背景: 电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库, 电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策, 大数据智能驱动的供应链…...
《动手学深度学习 Pytorch版》 10.7 Transformer
自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语…...
ORACLE-递归查询、树操作
1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…...
MySQL篇---第四篇
系列文章目录 文章目录 系列文章目录一、并发事务带来哪些问题?二、事务隔离级别有哪些?MySQL的默认隔离级别是?三、大表如何优化?一、并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对 同一数据进行操作…...
em/px/rem/vh/vw单位的区别
一、绝对长度单位 1.px 表示像素,显示器上每个像素点大小都是相同的 二、相对长度单位 2.em 相对于当前对象内文本的字体尺寸,如未设置对行内文本字体的尺寸,则相对于浏览器的默认字体(1em16px) em值不是固定的&…...
别再死磕localhost了!Dify连接MySQL报错1130?手把手教你搞定IP授权(附MySQL 8.0+命令)
别再死磕localhost了!Dify连接MySQL报错1130?手把手教你搞定IP授权(附MySQL 8.0命令) 当你在Dify中尝试将LLM生成的数据导入本地MySQL数据库时,可能会遇到一个令人头疼的错误:pymysql.err.OperationalError…...
如何无缝迁移HMCL配置?告别重复配置的4个关键策略
如何无缝迁移HMCL配置?告别重复配置的4个关键策略 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL 更换设备时,Minecraft玩家面临的最大挑…...
Pixel Script Temple多场景落地:政务宣传短视频、乡村振兴纪录片脚本生成
Pixel Script Temple多场景落地:政务宣传短视频、乡村振兴纪录片脚本生成 1. 专业剧本创作工具介绍 Pixel Script Temple(像素剧本圣殿)是一款基于Qwen2.5-14B-Instruct大模型深度优化的专业剧本创作工具。它将先进的AI推理能力与独特的8-B…...
AI 净界环境搭建:利用 Docker 镜像免配置运行
AI 净界环境搭建:利用 Docker 镜像免配置运行 你是不是也遇到过这样的烦恼?好不容易拍了一张满意的照片,或者找到一张心仪的素材图,却因为背景杂乱而无法直接使用。用传统的抠图工具,要么边缘粗糙得像狗啃的ÿ…...
Spoon与Gradle插件集成:现代化Android项目的最佳实践指南 [特殊字符]
Spoon与Gradle插件集成:现代化Android项目的最佳实践指南 🚀 【免费下载链接】spoon Distributing instrumentation tests to all your Androids. 项目地址: https://gitcode.com/gh_mirrors/sp/spoon Spoon是一个强大的Android测试分发工具&…...
Phi-4-mini-reasoning轻量模型选型指南:何时该用Phi-4-mini而非Qwen3
Phi-4-mini-reasoning轻量模型选型指南:何时该用Phi-4-mini而非Qwen3 1. 模型概述与核心优势 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族成员,它特别适合需要高…...
Qwen3.5-9B-AWQ-4bit视觉理解实战:10个高频办公场景的图文处理案例
Qwen3.5-9B-AWQ-4bit视觉理解实战:10个高频办公场景的图文处理案例 1. 认识这个强大的视觉助手 想象一下,当你面对一堆杂乱的文件、会议记录和产品图片时,有一个智能助手能帮你快速理解这些内容。这就是Qwen3.5-9B-AWQ-4bit能为你做的事情。…...
OpenClaw+Qwen3-14B自动化测试:3种Python脚本执行方案对比
OpenClawQwen3-14B自动化测试:3种Python脚本执行方案对比 1. 为什么需要测试Python脚本执行方案? 上周我在尝试用OpenClaw自动化执行数据分析任务时,遇到了一个典型问题:同样的Python脚本,在不同执行环境下表现差异巨…...
OpenClaw日志分析技巧:千问3.5-9B辅助故障定位
OpenClaw日志分析技巧:千问3.5-9B辅助故障定位 1. 为什么需要AI辅助日志分析? 上周排查一个OpenClaw任务失败的问题时,我盯着3MB的日志文件看了整整两小时。那些重复的报错堆栈和模糊的警告信息像迷宫一样——直到我意识到:与其…...
OpenClaw自动化测试:Gemma-3-12b-it驱动浏览器操作与结果校验
OpenClaw自动化测试:Gemma-3-12b-it驱动浏览器操作与结果校验 1. 为什么选择OpenClawGemma做自动化测试? 上周我在重构一个老旧的Web项目时,遇到了一个典型痛点:前端页面改版后,原有的Selenium测试脚本大面积失效。动…...
