进程的控制
进程 = task_struct + mm_struct(虚拟地址空间) + 页表 + 代码和数据 。 新建进程先有管理系统,然后才有代码和数据。
fork()函数:子进程返回0,父进程返回的是子进程的pid - - - 方便父进程对子进程标识。
进程终止:释放代码和数据占据的空间,释放内核数据结构,task_struct 延迟释放,预防僵尸进程。
echo $? - - - 获取父进程bash获取到的最近一个子进程的退出码。 退出码默认为0表示成功,非零失败,利用不同的非0值可以表明失败的原因给父进程bash,main函数的 return 就是一个返回退出码。
进程终止时三种情况,1.代码跑完结果正确,2.结果不正确。结果正确不正确可以通过进程的退出码决定。3.代码出现异常,提前退出了,一旦进程出异常退出码会没有意义,进程异常时OS发给进程的信号终止进程。
kill -11 pid - - - 直接给信号为段错误,终止进程。
说明:实际上只要是进程执行时出问题,都是OS给该进程发的信号导致的问题,因此进程退出时可以根据推出信号来判断进程是什么异常。
衡量一个进程退出,只需要一个退出码和退出信号判断进程退出的原因。
当一个进程退出时,会把自己的退出码和退出信号写入自己的PCB中,这样父进程就可以获取到子进程的退出信息得到进程的退出状态。
如何终止?
1.main函数中return,表明进程终止。非main函数return叫函数结束。
2.代码调用exit函数。在代码中任意位置调用 exit() 都是终止进程。exit 的参数就是退出码。
3._exit() 和 exit() 作用基本相同。
exit 是库函数,是C语言的。_exit 是系统调用。exit() 底层是在调用 _exit() ,但是多加了一层缓冲区冲刷。从下图可以看书,printf的缓冲区是不在OS内部的,在OS内部_exit也应该冲刷缓冲区。
进程等待
任何一个进程默认在结束时必须会被父进程等待,进程退出的时候如果父进程不做处理就会有僵尸进程 ‘Z’,导致内存泄漏。
父进程通过等待,解决僵尸进程回收系统资源。
获取子进程的的退出信息,了解子进程是什么原因退出的(可选功能)。
wait(int *status) - - - #include<sys/types.h> #include<sys/wait.h> - - - 等待成功,返回等待的子进程的 pid。等待父进程任意一个子进程退出。父进程 wait() 到子进程后就可以释放掉僵尸掉的子进程。如果子进程没有退出,父进程一直在阻塞等待(options==0)。
阻塞等待:
pid_t > 0 :等待成功,子进程退出了,返回子进程的pid
pid_t < 0 :等待失败。
pid_t waitpid(pid_t pid, int *status, int options):
pid - - - 需要等待的进程pid,pid = -1 说明设置父进程等待任何一个子进程退出,与wait作用相同。如果id = fork() 创建子进程后,这里的参数pid写fork的返回值id也表示的是等待创建的子进程。和wait()同作用。
status - - - 不需要设为NULL
status是输出型参数,表示的是等待的子进程的退出信息,退出信息指的是 退出码 + 退出信号 。
int类型有32位,status 只使用后16位,8-15位表示退出状态,0-7位表示退出信号。
拿到status的0-7和8-15位的值。
当子进程的代码直接死循环,从外部命令信号直接杀掉子进程如下图:
对于获取status的那些个位值如下更方便:
- WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)这个相当于是获取的status的0-7位并且查看是否正常,也就是信号位的值。
- WEXITSTATUS(status):若WIFEXITED非零,提取子进程退出码。(查看进程的退出码) 这个获取的是status的8-15位,也就是exit退出位的值。
当子进程没有退出时,父进程在waitpid()就是在阻塞等待,进程在阻塞等待,等到后父进程才开始运行。如果不想让父进程一直等待,第三个参数options的取值可以做到:
options - - - 0:阻塞等待,WNOHANG:非阻塞等待。
当非阻塞等待时有两种返回值:
- 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。就是说如果子进程没有退出则一直返回0.
- 若子进程正常结束,则返回该子进程的ID。
一般非阻塞等待时,非阻塞等待+循环=非阻塞轮询。允许父进程干一些其他的事情(DoOtherThing())。
相关文章:

进程的控制
进程 task_struct mm_struct(虚拟地址空间) 页表 代码和数据 。 新建进程先有管理系统,然后才有代码和数据。 fork()函数:子进程返回0,父进程返回的是子进程的pid - - - 方便父进程对子进程标识。 进程终止:释放代码和数据占…...

基于C语言实现的图书管理系统
使用Visual Studio 2022编译工具进行编写代码的。 项目源码直接奉上: book1.h头文件: #ifndef __BOOK1_H //预处理用于条件编译 避免头文件反复包含 #define __BOOK1_H#include<stdio.h> #include <string.h> #include<stdlib.h> #include<stdbool.h&g…...

删除 需要来自XXXX的权限才能对此文件夹进行更改 文件的解决办法
如果你也是: 如果你也有类似上面的问题,这篇文章算是你看对了,哦哟! 我的牙齿现在是怨灵的牙齿,可以啃下一头牛。 翻遍千山万水,咱们也是终于取到真经了家人们。 首先下一个everything好吗 甩一个官网链…...

ARM base instruction -- ccmp (immediate)
Conditional Compare (immediate) sets the value of the condition flags to the result of the comparison of a register value and an immediate value if the condition is TRUE, and an immediate value otherwise. 此指令一般出现在 cmp 指令之后,表示双重比…...

高德 阿里231滑块 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…...
Unity 的 WebGL 构建中资源图片访问方式
在 Unity 的 WebGL 构建中,资源图片是可以打包在 工程内部 使用的,前提是这些资源被正确地包含在构建中,并且能够通过合适的方式加载和访问。不同于传统的本地文件访问,WebGL 需要通过 Asset Bundles、Addressables 或 Resources …...

WinForms 中使用 MVVM 模式构建应用:实现登录页面、页面导航及 SQLite 数据库连接完整框架搭建过程
前言 在传统的 WinForms 应用程序开发中,很多开发者使用事件驱动的设计模式,直接将业务逻辑编写在界面代码中。然而,随着应用程序的复杂性增加,单一的界面文件变得臃肿,难以测试和维护。借鉴 WPF 中 MVVM(…...

Chrome调试工具(查看CSS属性)
来说说这个Chrome调试工具吧,梦回gdb,但是它没有gdb难 打开浏览器 有两种方式可以直接打开Chrome调试工具 直接按F12 鼠标右键页面 --- 检查元素 什么mc玩家是鸣潮 标签页含义 🤒 elements查看标签结构(展示html文件&#…...

MQTT从入门到精通之MQTT入门
MQTT入门 1 MQTT概述 1.1 MQTT简介 MQTT(Message Queuing Telemetry Transport)由IBM于1999年开发的一种基于**"发布订阅模式"的轻量级的消息传输协议**! 发布订阅模式是一种传统的客户端-服务器架构的替代方案,因为…...
Hadoop生态系统主要包括哪些组件以及它们的作用
Hadoop生态系统是一个开源的大数据处理框架,它主要由一系列组件构成,每个组件都承担着不同的功能和作用。以下是Hadoop生态系统的主要组件及其作用的详细解释: HDFS(Hadoop Distributed File System) 作用:…...
OpenResty 1.27.1.1 已经正式发布
OpenResty 1.27.1.1 已经正式发布,这是一个基于 NGINX 和 LuaJIT 的 web 平台。以下是关于此次发布的一些重点信息和更新内容: 下载与安装 你可以在此处下载最新版本的 OpenResty。提供了便携式源代码分发、Win32/Win64 二进制分发以及为 Ubuntu、Debi…...

定高虚拟列表:让大数据渲染变得轻松
定高虚拟列表 基本认识 在数据如潮水般涌来的今天,如何高效地展示和管理这些数据成为了开发者们面临的一大挑战,传统的列表渲染方式在处理大量数据时,往往会导致页面卡顿、滚动不流畅等问题,严重影响用户体验(在页面…...

python request与grequests该如何选择
requests & grequests requests 和 grequests 是Python中用于发送HTTP请求的不同库。requests 是一个同步、阻塞式库,而 grequests 是基于 requests 封装的异步非阻塞库,它利用了 gevent 库提供的协程机制,能够并发发送多个请求。 选择…...

Unity3D UI 拖拽
Unity3D 实现 UI 元素拖拽功能。 UI 拖拽 通常画布上的 UI 元素都是固定位置的,我们可以通过实现拖拽接口,让 UI 元素可以被拖拽到其他位置。 拖拽接口 创建一个脚本 UIDrag.cs,在默认继承的 MonoBehaviour 后面,再继承三个接…...
介绍一下memcpy(c基础)
memcpy函数void *memcpy(void *dest, const void *src, size_t n); dest:指向目标内存区域的指针,即复制的目的地。src:指向源内存区域的指针,即要被复制的内容的来源。n:要复制的字节数 主要功能是将src所指向的内存…...

【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
目录 一、相关面试题 1. HTTP 与 HTTPS 有哪些区别? 2. HTTPS 的工作原理?(https 是怎么建立连接的) (1)ClientHello (2)SeverHello (3)客户端回应 &a…...
python-23-一篇文章帮你理解Python推导式
python-23-一篇文章帮你理解Python推导式 一.简介 在 Python 中,推导式(Comprehensions)是一个简洁的语法,用于通过某种可迭代对象快速生成新的对象(如列表、字典、集合等!来开始我们今天的日拱一卒&…...

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查
目录 开始前准备的数据库dbblog如下: 第一步:创建项目后下载四个NuGet程序包 第二步:删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…...
CesiumJS 案例 P15:检测标记、鼠标点击移动标记、鼠标拖动标记
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、检测标记 <!DOCTYPE html> <html lang"en&…...

Webserver(4.9)本地套接字的通信
目录 本地套接字 本地套接字 TCP\UDP实现不同主机、网络通信 本地套接字实现本地的进程间的通信,类似的,一般采用TCP的通信流程 生成套接字文件 #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...

Linux系统:进程间通信-匿名与命名管道
本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道(Pipe)是一种进程间通信(IPC, Inter-Process Communication)机制,用于在不…...

Gitlab + Jenkins 实现 CICD
CICD 是持续集成(Continuous Integration, CI)和持续交付/部署(Continuous Delivery/Deployment, CD)的缩写,是现代软件开发中的一种自动化流程实践。下面介绍 Web 项目如何在代码提交到 Gitlab 后,自动发布…...

2025年ESWA SCI1区TOP,自适应学习粒子群算法AEPSO+动态周期调节灰色模型,深度解析+性能实测
目录 1.摘要2.粒子群算法PSO原理3.改进策略4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流 1.摘要 能源数据的科学预测对于能源行业决策和国家经济发展具有重要意义,尤其是短期能源预测,其精度直接影响经济运行效率。为了更好地提高预测模型…...