当前位置: 首页 > news >正文

[操作系统] 进程终止

在计算机操作系统中,进程(Process)是程序在运行中的实例,而进程的生命周期始于创建,终于终止。进程终止不仅仅意味着程序执行结束,还涉及资源的回收、状态的传递、以及可能的错误处理。在 Linux 和 Unix 系统中,进程的终止有多种方式,包括正常终止、异常终止、信号终止等。本文将深入探讨 进程终止 的概念、方法以及相关的进程退出码。


进程终止的基本概念

当一个进程终止时,操作系统会进行如下操作:

  • 释放进程所占用的资源(内存、文件描述符、CPU 等)。
  • 通知父进程(如果有的话),让其可以回收进程的退出状态。
  • 从进程调度器中移除该进程,使其不再执行。

进程的终止一般由三种情况触发:

  1. 代码运行完成,正常终止(例如 return 0)。
  2. 代码运行异常,导致非正常终止(例如 Segmentation Fault)。
  3. 外部干预,如用户手动终止或系统强制终止(例如 kill 命令)。

main函数的返回值通常表明程序的执行情况,通过不同的返回值可以表明程序运行正常或者通过数字表明出错原因,这个返回值就是进程退出码。父进程要知道子进程的运行情况,所以退出码会存在于子进程的PCB中,即使代码和页表数据清除也可以得到子进程信息。


进程终止的常见方法

在 Linux 系统中,进程终止的常见方法包括以下几种:

正常终止

正常终止指的是进程按照预期逻辑完成任务并退出,可以使用以下方式:

return 语句

main() 函数执行 return n; 时,实际上等价于 exit(n);,操作系统会将 main() 返回的值作为进程的退出码,作为exit()的参数。

#include <stdio.h>int main() {printf("程序正常执行\n");return 0;  // 进程正常终止,返回码 0
}
exit(n)

exit() 函数是 C 标准库提供的进程终止函数,它执行以下操作:

  • 执行 用户定义的清理函数atexit() 注册的函数)。
  • 关闭所有打开的文件流,刷新缓冲区。
  • 调用 _exit() 终止进程。
#include <stdio.h>
#include <stdlib.h>int main() {printf("使用 exit() 终止进程\n");exit(0);  // 进程正常终止,返回码 0
}
_exit(n)

_exit(n)系统调用,它与 exit(n) 类似,但不会执行 atexit() 注册的清理函数,也不会刷新 stdio 缓冲区,而是直接终止进程。

#include <unistd.h>int main() {printf("使用 _exit() 终止进程\n");_exit(0);  // 立即终止进程
}

exit()_exit() 的主要区别:

函数刷新缓冲区关闭文件描述符调用 atexit() 注册的函数
exit()
_exit()

异常终止

进程也可能因 运行时错误外部干预 导致异常终止,主要有以下几种情况:

1) 信号终止

操作系统可以通过 信号(signal) 终止进程,例如:

  • kill -9 <PID> 发送 SIGKILL 强制杀死进程。
  • Ctrl + C 发送 SIGINT 终止前台进程。
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>void sigint_handler(int signum) {printf("收到 SIGINT 信号,进程终止\n");exit(1);
}int main() {signal(SIGINT, sigint_handler);  // 捕获 SIGINT 信号while (1);  // 无限循环,等待信号
}

当用户按 Ctrl + C,进程会被 SIGINT 终止,并输出 "收到 SIGINT 信号,进程终止"

2) 访问非法内存

如果进程访问了 非法地址,操作系统会发送 SIGSEGV 信号,导致进程异常终止。

int main() {int *ptr = NULL;*ptr = 10;  // 访问非法地址,进程终止
}

进程退出码(Exit Code)解析

进程退出码(Exit Code)用于表示进程的 终止状态,可通过 $? 获取最近终止进程的退出码。例如:

./my_program
echo $?  # 输出进程退出码

常见退出码解释

退出码含义
0进程成功执行
1一般错误(错误但未具体说明)
2误用 shell 命令(非法参数等)
126权限问题,无法执行命令
127命令未找到
128+n进程因信号 n 终止,例如 SIGKILL (9) -> 137
130Ctrl + C 终止进程(SIGINT
255超出正常范围,通常是 exit(-1)exit(256)

示例:

ls /root
echo $?  # 若无权限访问,返回 126

总结

进程终止是计算机程序运行的 最终阶段,理解它的机制有助于更好地进行 进程控制调试。我们可以使用 returnexit()_exit() 进行 正常终止,也可能因信号、非法操作等导致 异常终止。此外,进程退出码是 进程状态的反馈,在 Linux Shell 和 C 语言编程中都非常重要。

相关文章:

[操作系统] 进程终止

在计算机操作系统中&#xff0c;进程&#xff08;Process&#xff09;是程序在运行中的实例&#xff0c;而进程的生命周期始于创建&#xff0c;终于终止。进程终止不仅仅意味着程序执行结束&#xff0c;还涉及资源的回收、状态的传递、以及可能的错误处理。在 Linux 和 Unix 系…...

[x86 ubuntu22.04]进入S4失败

目录 1 问题描述 2 解决过程 2.1 查看内核日志 2.2 新建一个交换分区 2.3 指定交换分区的位置 1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 使用“echo disk > /sys/power/state”命令进入 S4&#xff0c;但是无法…...

12.外观模式(Facade Pattern)

定义 外观模式&#xff08;Facade Pattern&#xff09; 是一种结构型设计模式&#xff0c;它通过为复杂的子系统提供一个统一的接口&#xff0c;使得子系统的使用更加简化。外观模式通常隐藏了复杂的内部子系统&#xff0c;使得客户端可以通过一个简单的接口与这些子系统进行交…...

ES6 入门教程:箭头函数、解构赋值及其他新特性详解

ES6 入门教程&#xff1a;箭头函数、解构赋值及其他新特性详解 ES6 入门教程&#xff1a;箭头函数、解构赋值及其他新特性详解引言什么是 ES6&#xff1f;箭头函数&#xff08;Arrow Functions&#xff09;1. 基本语法2. 常见特点&#xff08;1&#xff09;没有自己的 this 上下…...

win编译openssl

一、perl执行脚本 1、安装perl脚本 perl安装 2、配置perl脚本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、编译openssl 1、使用vs工具编译nmake 如果使用命令行nmake编译会提示“无法打开包括文件: “limits.h”“ 等错误信息 所以…...

51单片机看门狗系统

在 STC89C52 单片机中&#xff0c;看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定&#xff0c;但是它在头文件中并未给出&#xff0c;因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…...

探索 paraphrase-MiniLM-L6-v2 模型在自然语言处理中的应用

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;将文本数据转换为机器学习模型可以处理的格式是至关重要的。近年来&#xff0c;sentence-transformers 库因其在文本嵌入方面的卓越表现而受到广泛关注。本文将深入探讨 paraphrase-MiniLM-L6-v2 模型&#xff0c;这…...

2025最新软件测试面试大全(附答案+文档)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、问&#xff1a;你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一个bug&#xff0c;你应该怎样解决? 首先&#xff0c;将问题提交到缺陷管理库里…...

Java语法进阶

目录&#xff1a; Object类、常用APICollection、泛型List、Set、数据结构、CollectionsMap与斗地主案例异常、线程线程、同步等待与唤醒案例、线程池、Lambda表达式File类、递归字节流、字符流缓冲流、转换流、序列化流、Files网络编程 十二、函数式接口Stream流、方法引用 一…...

UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK

UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK Neurips23 推荐指数&#xff1a;#paper/⭐⭐⭐#​&#xff08;工作量不小) 动机 在大多数分子表征学习方法中&#xff0c;分子被视为 1D 顺序标记或2D 拓扑图&#xff0c;这限制了它们为下游任务整合…...

笔记day7

文章目录 1 分页功能实现2 分页器的展示需要哪些数据&#xff08;条件&#xff09;&#xff1f;3 自定义分页器4 分页器存在问题5 分页器动态展示6 开发某一个商品的详情页面 1 分页功能实现 为什么很多项目采用分页功能&#xff0c;比如电商平台同时展示的数据有很多&#xf…...

106,【6】 buuctf web [SUCTF 2019]CheckIn

进入靶场 文件上传 老规矩&#xff0c;桌面有啥传啥 过滤了<? 寻找不含<?的一句话木马 文件名 123(2).php.jpg 文件内容 GIF89a? <script language"php">eval($_GET[123]);</script> 123即密码&#xff0c;可凭借个人喜好更换 再上传一个文…...

基于Ubuntu2404搭建Zabbix7.2

Zabbix 搭建zabbix zabbix7.2已推出&#xff1a;官网 增加的新功能如下&#xff1a; 1.使用新的热门商品小部件全面概览指标 数据概览小部件已转换为热门项目小部件使用项目模式可以实现细粒度的项目选择利用条形图、指标和迷你图来可视化您的数据定义价值阈值以动态地可视化…...

OPENGLPG第九版学习 - 着色器基础

文章目录 2.1 着色器与OpenGL2.2 0penGL的可编程管线2.3 OpenGL着色语言GLSL概述2.3.1 使用GLSL构建着色器变量的声明变量的作用域变量的初始化构造函数 、 类型转换聚合类型访问向量和矩阵中的元素结构体数组多维数组 2.3.2 存储限制符const 存储限制符in 存储限制符out 存储限…...

Android 使用ExpandableListView时,需要注意哪些细节

1. 布局属性设置 尺寸属性 宽度和高度&#xff1a;要合理设置 android:layout_width 和 android:layout_height 属性。如果设置为 match_parent&#xff0c;它会填满父容器&#xff1b;设置为 wrap_content&#xff0c;则会根据内容自动调整大小。例如&#xff0c;若想让 Exp…...

redis简介及应用

文章目录 1.redis简介2.安装配置2.1 单机部署2.2 配置 3 主从部署4 哨兵部署5.集群部署6.客户端工具 1.redis简介 某些网站出现的问题&#xff0c;如12306、淘宝等… 2.安装配置 2.1 单机部署 安装gcc、关闭防火墙、关闭selinux等 #安装gcc yum -y install gcc #关闭防火墙…...

Electron使用WebAssembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssembly源文件 C语言实现C…...

人工智能赋能企业系统架构设计:以ERP与CRM系统为例

一、引言 1.1 研究背景与意义 在数字化时代&#xff0c;信息技术飞速发展&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为一项具有变革性的技术&#xff0c;正深刻地影响着各个领域。近年来&#xff0c;AI 在技术上取得了显著突破&#xff0c;…...

NacosRce到docker逃逸实战

NacosRce到docker逃逸实战 1、Nacos Derby Rce打入内存马 这个漏洞的原理大家应该都知道&#xff0c; 2.3.2 < Nacos < 2.4.0版本默认derby接口未授权访问&#xff0c;攻击者可利用未授权访问执行SQL语句加载构造恶意的JAR包导致出现远程代码执行漏洞。 在日常的漏洞挖…...

Linux:文件系统(软硬链接)

目录 inode ext2文件系统 Block Group 超级块&#xff08;Super Block&#xff09; GDT&#xff08;Group Descriptor Table&#xff09; 块位图&#xff08;Block Bitmap&#xff09; inode位图&#xff08;Inode Bitmap&#xff09; i节点表&#xff08;inode Tabl…...

R包版本冲突别头疼:手把手教你降级igraph 2.1.1,解决monocle3的orderCells报错

R包版本冲突实战指南&#xff1a;精准降级igraph解决monocle3依赖问题 当你满怀期待地安装好monocle3准备进行单细胞拟时序分析时&#xff0c;突然弹出的nei() was deprecated in igraph 2.1.0报错就像一盆冷水浇灭了热情。这种R包版本冲突在生物信息学分析中屡见不鲜&#xff…...

Qt桌面应用集成PaddleOCR:从环境搭建到精准识别的实践指南

1. 环境准备&#xff1a;搭建PaddleOCR的Qt开发环境 第一次在Qt里折腾PaddleOCR时&#xff0c;我对着官方文档折腾了半天还是报错&#xff0c;后来发现是第三方库的路径没配好。这里分享下我踩坑后总结的可靠方案。 核心依赖三件套&#xff1a;PaddlePaddle推理库、PaddleOCR C…...

LingBot-Depth效果实测:与传感器原生深度对比的绝对误差(mm)分布图

LingBot-Depth效果实测&#xff1a;与传感器原生深度对比的绝对误差&#xff08;mm&#xff09;分布图 1. 引言&#xff1a;当深度图遇上“脑补”大师 想象一下&#xff0c;你手里有一张用深度相机拍出来的照片&#xff0c;它告诉你每个像素离相机有多远。但问题是&#xff0…...

赋能合作共赢——建设银行广东省茂名市分行:走进汽车经销商,开展金融知识普及活动

筑牢金融防线 赋能合作共赢——建行广东省茂名市分行走进重点合作汽车经销商&#xff0c;开展金融知识普及活动为进一步深化银企合作关系&#xff0c;履行金融机构社会责任&#xff0c;提升合作企业员工及客户的金融安全意识&#xff0c;切实保护金融消费者合法权益&#xff0c…...

国行iPhone Siri功能意外上线又撤回,背后暗藏玄机

iPhone“Siri”变身“Apple智能与Siri”&#xff0c;意外功能短暂亮相3月31日凌晨&#xff0c;部分国行iPhone用户惊喜发现&#xff0c;手机设置中的“Siri”入口悄然变更为“Apple智能与Siri”&#xff0c;同时还短暂解锁了端侧模型下载及AI功能。不过&#xff0c;这一新鲜体验…...

UnityLockstep:构建零延迟多人游戏的终极同步框架

UnityLockstep&#xff1a;构建零延迟多人游戏的终极同步框架 【免费下载链接】UnityLockstep Deterministic Lockstep with clientside prediction and rollback 项目地址: https://gitcode.com/gh_mirrors/un/UnityLockstep 在多人游戏开发中&#xff0c;你是否曾为网…...

Beyond Compare 5终极激活指南:免费获取永久授权密钥的完整教程

Beyond Compare 5终极激活指南&#xff1a;免费获取永久授权密钥的完整教程 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen Beyond Compare 5作为业界领先的文件对比工具&#xff0c;其强大的功…...

微信聊天记录的数字守护:WeChatMsg本地存储解决方案全解析

微信聊天记录的数字守护&#xff1a;WeChatMsg本地存储解决方案全解析 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

Linux 内核中的信号处理:从发送到捕获

Linux 内核中的信号处理&#xff1a;从发送到捕获 引言 作为一名深耕操作系统和嵌入式开发的工程师&#xff0c;我深知通知机制的重要性。在系统开发中&#xff0c;及时的通知可以帮助系统快速响应事件。在 Linux 内核中&#xff0c;信号是一种重要的进程间通信机制&#xff0c…...

如何避免开源项目集成版本管理中的3个常见陷阱?

如何避免开源项目集成版本管理中的3个常见陷阱&#xff1f; 【免费下载链接】ha_xiaomi_home Xiaomi Home Integration for Home Assistant 项目地址: https://gitcode.com/GitHub_Trending/ha/ha_xiaomi_home 当你尝试将Xiaomi Home集成到Home Assistant时&#xff0c;…...