Linux中进程的控制
一、进程的创建
1、知识储备
进程的创建要调用系统接口,头文件 #include<unistd.h> 函数fork()
由于之前的铺垫我们现在可以更新一个概念
进程 = 内核数据结构(task_struct, mm_struct, 页表....)+ 代码 + 数据
所以如何理解进程的独立性呢?
就是上述组成进程的结构都是独立的,互不影响的。
那为什么 fork() 返回的是子进程的pid呢?
是为了让父进程对子进程进行表示和管理。
2、理解fork()
(1)fork() 常见用法
a、在一个代码中通过 fork() 不同的返回值用 if else分流,以达到不同进程执行不同代码的目的。
b、可以让父子进程独立进行完全不同的代码。
(2)fork() 失败的原因
a、操作系统中进程太多。
b、实际用户创建的进程太多,超出规定个数。
二、进程的终止
首先我们要知道进程是先创建内核数据结构,再加载代码和数据。
1、终止的表现
会释放代码和数据所占据的空间,释放内核数据结构(task_struct 会延期释放)
2、终止的三种情况
(1)观察现象
首先我们先观察一个现象

![]()

![]()
当我们以前在写c语言代码时,我们都是 return 0; 结尾,当我们今天 return 100; 时,用 echo $? 命令获取进程的退出码时,就会发现退出码和 return 后面的数字是一样的。
(2)解释 echo $?
echo:内建命令,打印bash内部变量数据。
$:访问变量内容。
?:父进程bash获取最近一个子进程的退出码。
(3)退出码
退出码0是成功,非0是失败。
每一个非0数都有不同的失败原因。
头文件 #include<string.h> 函数 char* strerror(int num) 可以查看退出码。



上图只截了一部分退出码。
退出码的作用就是告诉父进程,子进程把任务完成的怎么样。
结论:当代码跑完时,结果的正确与否是由退出码反馈给用户的。
(4)退出信号
与退出码不同,退出信号是代码还没跑完,系统就崩溃了(操作系统发现进程做了不该做的事,比如访问野指针等等),操作系统就会杀死进程。
所以一旦出现异常,退出码也就没有意义了,但是返回的退出信号是有意义的。
例如:Segmentation fault 就是段错误,代码段是有错误的。
退出信号的本质:操作系统给进程发信号并终止进程。
之前我们说kill -9 可以直接杀死进程也就是这个原因,而我们上面提到的段错误 Segmentation fault 就是操作系统发送了 kill -11 信号。

(5)总结
衡量一个进程的退出,只要看退出码和退出信号。
先确认是否异常,若不是才看退出码。
所以在子进程的 task_struct 中就会有 exit_code(退出码) exit_signal(退出信号),在执行完代码后写入退出码和退出信号供父进程读取。

3、如何终止
(1)main()函数中的 return 代表进程终止(普通函数 return 表示函数结束)
(2)调用头文件#include<stdlib.h> 函数 void exit(int status) status相当于退出码,exit等价于return

(3)调用头文件#include<unistd.h> 函数 void _exit(int status),基本与exit函数相同,一个是c库函数,一个是系统调用。

区别
exit 执行时会冲刷缓冲区,但是 _exit不会,所以其实这里所说的缓冲区只是c库层面的,不是系统调用层面的缓冲区。
exit本质就是底层调用 _exit
三、进程等待
任何子进程在退出的情况下必须要被父进程等待。如果父进程不管,子进程就会处于僵尸状态,导致内存泄漏。
三、进程的等待
1、为什么父进程要等待子进程
(1)解决僵尸问题,回收系统资源。(必须)
(2)获取子进程退出信息,知道子进程为什么退出。(可选)
2、怎么等待

(1)wait 函数
头文件 #include<sys/types.h> #include<sys/wait.h>
函数 pid_t wait(int* status)
等待成功返回子进程的pid,wait(NULL)表示父进程等待任意一个子进程退出。
若子进程一直不退出,父进程就进入阻塞等待。
阻塞等待的本质:把父进程设为非运行状态(S),链入到子进程队列中,子进程退出,父进程唤醒。
(2)waitpid 函数
头文件 #include<sys/types.h> #include<sys/wait.h>
函数 pid_t waitpid(pid_t id, int* status, int options)
waitpid(-1, NULL, 0)等价于wait(NULL)
a、理解参数 id
id 表示要等待哪个子进程
所以理解代码:
pid_t id = fork();
waitpid(id, NULL, 0);
在父进程中fork()返回子进程pid,所以就指定了要返回哪个子进程了。
b、理解参数 status
status是输出型参数(例如 scanf(),就是把数值写入到一个变量中),输出的是退出信息(包括退出码和退出信号)
理解额代码:

我们知道int有32位bit位,status只考虑低16位

获取退出码:(status>>8) & 0xFF
获取退出信息:status & 0x7F
c、获取退出码的宏
WIFEXITED(status) 代码正常走完就返回真
WEXITSTATUS(status) 若WIFEXITED为真就提取退出码
(3)非阻塞等待
上述父进程都是等子进程跑完之后才工作的,这种都是阻塞等待,调用waitpid默认也是阻塞等待,但是我们想让父进程在等待时做其他事情,就要让 waitpid 中 option 设成 WNOHANG
此时返回值 < 0:等待失败。
返回值 = 0:检测成功,但是子进程未退出,等待下一次检测。
返回值 > 0:等待成功,并且父进程回收成功。
非阻塞等待 + 循环 = 非阻塞轮询
达到父进程能做其他事情。
相关文章:
Linux中进程的控制
一、进程的创建 1、知识储备 进程的创建要调用系统接口,头文件 #include<unistd.h> 函数fork() 由于之前的铺垫我们现在可以更新一个概念 进程 内核数据结构(task_struct, mm_struct, 页表....) 代码 数据 所以如何理解进程的独…...
【源码】Sharding-JDBC源码分析之JDBC
Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...
Java | Leetcode Java题解之第273题整数转换英文表示
题目: 题解: class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…...
数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)
文章目录 一、简单选择排序原理二、C/C代码实现总结: 在计算机科学中,排序算法是一种非常基础且重要的算法。简单选择排序(Selection Sort)作为其中的一种,因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…...
使用vscode搜索打开的文件夹下的文件
右键空白处打开命令面板 摁一次删除键,删除掉图中的大于号 这样就能够找到例化的模块,文件具体在哪个位置,然后打开了...
力扣778.水位上升的泳池中游泳
力扣778.水位上升的泳池中游泳 二分 bfs class Solution {int dx[4] {1,0,-1,0},dy[4] {0,1,0,-1};public:int swimInWater(vector<vector<int>>& grid) {int n grid.size();auto check [&](int mid) -> bool{queue<pair<int,int>>…...
Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了
基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…...
Halcon机器视觉15种缺陷检测案例_9找出所有网格顶点的位置
Halcon机器视觉15种缺陷检测案例_9找出所有网格顶点的位置 效果 原图 代码 *9找出所有网格顶点的位置 dev_update_off ()read_image (Image, 9找出所有风格顶点的位置) get_image_size (Image, Width, Height) *关闭已打开的窗口 dev_close_window ()dev_open_window (0, 0, …...
w30-python02-pytest入门
代码如下: import pytest class Test_Obj:"""测试类"""#用例级别前后置def setup(self):print(用例级别------的前置处理)def teardown(self):print("用例级别--------的后置处理")# 用例def test_case1(self):print(&quo…...
WPF+Mvvm项目入门完整教程-仓储管理系统(二)
目录 一、搭建一个主界面框架二、实现步骤1.主界面区域划分2.主界面区域实现 一、搭建一个主界面框架 主要实现主界面的框架样式和基础功能。这里特别说明一下,由于MvvmLight 已经过时不在维护,本项目决定将MvvmLight框架变更为 CommunityToolkit.Mvvm …...
SkyWalking入门搭建【apache-skywalking-apm-10.0.0】
Java学习文档 视频讲解 文章目录 一、准备二、服务启动2-1、Nacos启动2-2、SkyWalking服务端启动2-3、SkyWalking控制台启动2-4、自定义服务接入 SkyWalking 三、常用监控3-1、服务请求通过率3-2、服务请求拓扑图3-3、链路 四、日志配置五、性能剖析六、数据持久化6-1、MySQL持…...
exo项目目录架构
目录 .yml 文件是 YAML(YAML Aint Markup Language) exo项目目录架构 文件作用 topology、viz:项目拓扑结构可视化相关的代码或工具。 项目目录架构 文件作用 .yml 文件是 YAML(YAML Aint Markup Language) 文件的扩展名,YAML 是一种人类可读的数据序列化标准,通…...
mysql中where与on区别
WHERE子句 作用范围:WHERE子句主要用于过滤FROM子句返回的结果集。它可以在SELECT、UPDATE、DELETE语句中使用,以限制哪些行被包含在最终的查询结果中,或者哪些行被更新或删除。应用场景:当需要基于某些条件过滤结果集时…...
filebeat把日志文件上传到Es中配置(ES7版本)
默认的filebeat配置会把所有的索引都放到一个文件中,通过摸索发现可以自定义索引的名字、模板、生命周期 (重点注意)该配置文件只适应于ES版本是7,不适应于8的版本,两个版本的配置文件差异很大 /app/logs/info.log日…...
Vue Router基础
Router 的作用是在单页应用(SPA)中将浏览器的URL和用户看到的内容绑定起来。当用户在浏览不同页面时,URL会随之更新,但页面不需要从服务器重新加载。 1 Router 基础 RouterView RouterView 用于渲染当前URL路径对应的路由组件。…...
Apache压测工具ab(Apache Bench)工具的下载安装和使用示例
场景 Jmeter进行http接口压力测试: Jmeter进行http接口压力测试_接口压测两万量-CSDN博客 上面讲压测工具Jmeter的使用,下面介绍另外一个ab(Apache Bench)压测工具的使用。 apache bench apache bench是apache自带的压力测试工具。 ab不仅可以对ap…...
IPIDEA与Python爬虫:联手解锁全球电商数据宝库
IPIDEA与Python爬虫:联手解锁全球电商数据宝库 如何运用代理IP在电商领域进行高效数据采集。特别是在遭遇访问限制的情况下,如何优雅地绕过那些恼人的访问管理机制。当然,在我们的探险之旅中,开源神器PlugLink也将适时出场&#…...
Fine-BI学习笔记
官方学习文档:快速入门指南- FineBI帮助文档 FineBI帮助文档 (fanruan.com) 1.零基础入门 1.1 功能简介 完成四个流程:新建分析主题、添加数据、分析数据、分享协作。 示例数据获取:5分钟上手FineBI - FineBI帮助文档 (fanruan.com) 1.2 …...
AI 辅助编程 Coding AI 辅助研发组织的技术蓝图
简简单单 Online zuozuo:欢迎商业合作 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo :联系我们:VX :tja6288 / EMAIL: 347969164@qq.com 文章目录 AI 辅助编程 Coding A…...
VScode 批量操作
VScode 批量操作 批量修改 按住 alt/option 键, 选择需要批量操作的位置 如果是多行,则按住 altshift 键 可以直接操作 但是有时候比如变量命名,可能需要递增操作的命名 需要下载插件 Increment Selection 按照1的方法多选光标之后&am…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
