01-系统编程
一、程序和进程的区别:
window系统:
1、程序存储在硬盘中,文件格式为.exe后缀,静态的
2、进程运行在内存中,动态的
Linux系统
1、程序存储在硬盘中,文件格式为.ELF(可执行的链接文件)后缀,静态的
2、进程运行在内存中,动态的
二、进程的内存划分:

1、PM实际内存,VM虚拟内存,每一个程序加载都会分配出一个虚拟内存,虚拟内存有:内核,栈,堆,数据段(.bss,.data,.rodata),代码段(.text,.init)。且每个进程的虚拟内存都是相互独立的。
2、存储空间,定义,生命周期,作用域,特点
局部变量,栈区,定义{}里面,{}里有效,{}里有效,自动分配自动释放
全局变量,数据段中,所有函数之外定义,程序死就死,整个程序有效,程序中所有函数可见
堆空间变量,堆空间中,free之前都有效,free之前都有效,手动分配手动释放
静态变量,数据段中,用static修饰,整个程序有效,静态局部变量(当前函数中),全局变量(在当前文件中)
常量、数据段,用const修饰,整个程序有效,整个程序有效,常量无法修改。
三、进程命令
1、ps 查看当前系统的进程
2、ps -e 查看当前系统的所有进程

3、 top 查看进程状态,相当于window的任务管理器
4、kill 发送一个信号给进程有以下可选
HUP 1 终端挂断
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
KILL 9 强制终止
TERM 15 终止
CONT 18 继续(与STOP相反,fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)5、pstree 查看进程关系图
四、进程状态(重点)
1、进程状态:

标准图如下:

就绪态: 时间片用完,睡眠,暂停的进程都会进入到就绪态,等待CPU的调度。
执行态: CPU调度,获得CPU的使用权,得到时间片。 处理当前进程的数据
睡眠态: 调用sleep函数或者 scanf..... 阻塞函数
暂停态: 收到STOP信号后进入暂停态
僵尸态: 进程死亡后就进入僵尸态,等待父亲收尸(回收资源) 知道儿子的死因
死亡态: 进程死亡后并且父进程回收了资源!
2、什么是时间片?
百度可知,时间片也可成为“量子”,“处理片”即分时操作系统分配给每个正在运行进程微观上的一段CPU时间。
五、fork进程创建
1、多进程有什么用?当然是为了实现多任务的执行,提高效率!
1、fork函数:pid_t fork(void); 头文件:#include <unistd.h>
参数:void
返回值:父进程返回子进程的pid子进程返回 0失败返回 -1
2、父子进程的资源
父子进程的内存是相互独立的,但他们的地址是一样的,创建之初他们的整个内存空间(栈,堆,数据段,代码段,标准IO等等)是一样的。
但他们的进程号PID是不一样的,因为PID是唯一的。

父子进程的数据交换:

例子如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{// 1.创建一个文件int fd = open("my.txt", O_RDWR | O_CREAT, 0777);// 2.创建一个进程pid_t pid = fork();if (pid == 0) // 子进程{while (1){// 读取父进程发送的数据char buf[1024];lseek(fd, 0, SEEK_SET); // 把光标偏移到文件头int size = read(fd, buf, sizeof(buf));if (size > 0){printf("子进程接收到的数据:%s\n", buf);}sleep(2);}}if (pid > 0) // 父进程{while (1){// 向子进程发送数据char buf[1024];printf("请输入要发送的数据:");scanf("%s", buf);write(fd, buf, strlen(buf)); // 写入数据到文件中}}
}
3、孤儿进程(没有父进程,即父进程先死,此时子进程会托管给系统进程(这个进程是没有父进程的))
init进程的产生过程;

孤儿进程的例子:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{for (int i = 0; i < 10; i++) // 循环创建 10 个进程{// 创建一个进程pid_t pid = fork();if (pid == 0){printf("子进程 %d\n", getpid());getchar(); // 阻塞等待,让子进程不死亡}}printf("父进程20S后死亡\n");sleep(20);printf("父进程死亡\n");return 0;
}

4、僵尸进程(父进程没有及时回收子进程的资源导致,即父进程不知道子进程的死因,导致子进程一直占用系统的内存资源)
例子:
#include <stdio.h>
#include <unistd.h>
int main()
{for (int i = 0; i < 10; i++){// 创建一个进程pid_t pid = fork();if (pid == 0) // 子进程{printf("子进程死亡 %d\n", getpid());return 0; // 在子进程的内部return 结束的是子进程}}printf("父进程正在运行,按任意键结束\n");getchar();
}

所以为了防止僵尸进程的产生,父进程wait回收子进程的资源。
六、wait进程资源的回收
头文件: #include <sys/wait.h>wait函数:pid_t wait(int *_Nullable wstatus); //等待任意一个进程退出 wstatus:进程退出状态
pid_t waitpid(pid_t pid, int *_Nullable wstatus, int options); //等待指定的pid进程退出 pid:等待的进程pid wstatus: 进程退出状态 options: 等待属性,默认为 0 例子:等待任意一个进程退出wait(NULL)
1、获取子进程的死亡原因及返回值。

例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{// 创建一个子进程pid_t pid = fork();if (pid == 0){int i = 0;while (1){printf("%d 子进程正在运行 %d\n", getpid(), i++);sleep(1);if (i == 10){printf("子进程结束\n");return 123; // 正常退出,传递给父进程}}}printf("父进程运行,等待子进程结束回收资源\n");int wstat = 0; // 退出状态码wait(&wstat); // 等待任意一个子进程结束,一直等待,直到子进程结束为止// 判断进程的死亡原因if (WIFEXITED(wstat)){printf("子进程正常退出\n");// 获取子进程的退出值 return 值printf("子进程的退出值是 %d\n", WEXITSTATUS(wstat));}
}
相关文章:
01-系统编程
一、程序和进程的区别: window系统: 1、程序存储在硬盘中,文件格式为.exe后缀,静态的 2、进程运行在内存中,动态的 Linux系统 1、程序存储在硬盘中,文件格式为.ELF(可执行的链接文件&#…...
Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接
一、gcc/g基础认知 在Linux开发环境中,gcc和g是我们最常用的编译器工具: gcc:GNU C Compiler,专门用于编译C语言程序g:GNU C Compiler,用于编译C程序(也可编译C语言) 📌…...
UMI-OCR Docker 部署
额外补充 Docker 0.前置条件 部署前,请检查主机的CPU是否具有AVX指令集 lscpu | grep avx 输出如下即可继续部署 Flags: ... avx ... avx2 ... 1.下载dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…...
26考研|数学分析:定积分及应用
这一部分作为数学分析的灵魂,在数学分析的计算中,绝大部分的问题都可以转换成定积分的计算问题,所以在这部分的学习中,一定要注意提升计算能力,除此之外,由积分引出的相关积分不等式也是分析的重点和难点&a…...
React Hooks使用方法:useState,useRef,useEffect,useReducer,useContext用法实战案例
react hooks介绍,包括了state,ref,effect,reducer,context等常见hooks,也包括forwardRef和createContext用法,下面看代码吧,我用的是js写的。每个hook都做了个案例。 // 使用state来…...
线程池详解:在SpringBoot中的最佳实践
线程池详解:在SpringBoot中的最佳实践 引言 在Java并发编程中,线程池是一种非常重要的资源管理工具,它允许我们在应用程序中有效地管理和重用线程,从而提高性能并降低资源消耗。特别是在SpringBoot等企业级应用中,正…...
扩展卡尔曼滤波
1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统,扩展卡尔曼滤波 则扩展到了非线性系统,核心原理就是将非线性系统线性化,主要用的的知识点是 泰勒展开(我另外一篇文章的链接),如下是泰勒展开的公式…...
AI作为学术评审专家有哪些优缺点?
大家好这里是AIWritePaper官方账号,官网👉AIWritePaper论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易,即使对老师来说,找人评审论文也是一件苦活。我们这个时…...
微信小程序登录和获取手机号
目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号(可以去微信公众平台创建一个测试号或者正式号) appid:小程序id …...
4.Matplotlib:基础绘图
一 直方图 1.如何构建直方图 将值的范围分段,将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 2.直方图的适用场景 一般用横轴表示数据类型,纵轴表示分布情况。 直方图可以用于识别数据的分布模式和异常值,以及观察数…...
与Aspose.pdf类似的jar库分享
如果你在寻找类似于 Aspose.PDF 的 JAR 库,这些库通常用于处理 PDF 文档的创建、编辑、转换、合并等功能。以下是一些类似的 Java 库,它们提供 PDF 处理的功能,其中一些是收费的,但也有开源选项: 1. iText (iText PDF…...
VSCode 市场发现恶意扩展正在传播勒索软件!
在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店,但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld,目前已从商店中删除。 此外,ahban.cychelloworld 扩展于 2024 年 10 月…...
工作流引擎Flowable介绍及SpringBoot整合使用实例
Flowable简介 Flowable 是一个轻量级的业务流程管理(BPM)和工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…...
K8s证书--运维之最佳选择(K8s Certificate - the best Choice for Operation and Maintenance)
K8s证书--运维之最佳选择 No -Number- 01 一个月速通CKA 为了速通CKA,主要办了两件事情 1. 在官方的Killercoda上,练习CKA的题目。把命令敲熟悉。 // https://killercoda.com/killer-shell-ckad 2. 使用K3s在多台虚拟机上快速搭建了K8s集群&…...
MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图
文章目录 MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图一、MySQL 8.0.41 目录结构总览1.1 安装目录核心子目录1.2 数据目录关键组件 二、核心源码模块剖析2.1 SQL 引擎核心(sql / 目录)2.1.1 核心组件2.1.2 架构亮点 2.2 存储引擎…...
Leaflet.js+leaflet.heat实现热力图
Leaflet热力图 #mermaid-svg-I1zXN0OrNCBGKEWy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-icon{fill:#552222;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-text{fill:#552222;stroke:#5522…...
通过git文件查看大模型下载链接的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
多源最短路:Floyd算法の暴力美学
多源最短路求解的是图中的任意两个节点之间的最短路。 前文我们已经讲过单源最短路,我们完全可以做n次单源最短路算法,求出任意两节点的最短距离。最快的堆优化版的 dijkstra 算法的时间复杂度为o(m * logm),枚举n次时…...
初教六双机一飞冲天动作要领
初教六双机一飞冲天动作要领 初教六双机“一飞冲天”是典型的垂直爬升特技动作,要求双机以近乎垂直的姿态同步高速爬升,展现飞机的动力性能与编队协同能力。以下是该动作的详细技术解析与执行要点: 一、动作定义与特点 基本形态 双机以相同速…...
qtcore在docker容器中运行
FROM ubuntu # 设置时区环境变量 ENV TZAsia/Shanghai RUN echo "${TZ}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && apt update \ && apt install -y tzdata \ && rm -rf /var/lib/apt…...
simpleITK - Setup - Pythonic Syntactic Sugar
Pythonic Syntactic Sugar Image Basics Notebook 非常简单,与 ITK 的 C 接口非常接近。 Sugar非常棒,它能让你精力充沛,更快地完成任务!SimpleITK 也应用了大量Sugar来帮助更快地完成任务。 %matplotlib inline import matplo…...
【leetcode hot 100 215】数组中的第K个最大元素
解法一:维护最大最小值 -> 堆 -> k个元素的最小值堆 class Solution {public int findKthLargest(int[] nums, int k) {// 维护最大最小值 -> 堆 -> k个元素的最小值堆PriorityQueue<Integer> heap new PriorityQueue<>((n1, n2) -> n…...
下载vmware17
我用VMware10安装ubuntu24,死活不能成功,要么突然退出,要么装着装着,眼看完成,居然卡住不动,一查日志,提示光盘读取失败(用的ISO文件,居然装模作样的说光驱读取失败&…...
德昂观点:如何看待MicroStrategy改名为Strategy?
2025年2月,纳斯达克上市公司MicroStrategy(股票代码:MSTR)宣布更名为“Strategy”,并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新,更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…...
嵌入式八股RTOS与Linux---网络系统篇
前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块 这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…...
Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)
Django 普通 http 协议不够安全,无法支持连接本地摄像头(虽然在本地 localhost 上能连),此时需要切换成 https 协议(先提个醒,我这个方法最后失败了,不过对您应该也有帮助) 目录 配置…...
告别Win10强制更新:永久关闭系统更新指南
你是否厌倦了Win10在开关机时的强制自动更新?无论你是在赶时间还是专注于工作,那突如其来的更新提示总是让人不胜其烦。屏幕上那句“正在更新,请勿关闭电源”的提示,仿佛是对你无奈的嘲笑。别担心,今天我将教你如何永久…...
【django】2-1 (django配置) 应用配置、中间件配置、模板配置
文章目录 1 基本设置2 应用配置2.1 django核心应用2.2 常用第三方应用 3 中间件3.1 默认使用的中间件3.2 其它内置中间件3.3 第三方中间件3.4 中间件的执行顺序 4 模板引擎配置4.1 配置字典的键4.2 上下文处理器 创建django项目后,会自动生成初始的项目文件如下&…...
nginx-rtmp-module之ngx_rtmp.c代码详解
1. ngx_rtmp.c — RTMP模块的主逻辑实现 这个文件是 RTMP 模块的核心,包含了 RTMP 协议模块的初始化、配置解析和服务端口的管理等功能。它的主要职责是处理 RTMP 配置、初始化模块、配置事件、初始化 RTMP 端口等。 主要功能和逻辑: 模块初始化 (ngx_…...
罗杰斯特回归
定义 逻辑回归其实就是原来的线性回归加了激活函数,这个函数其实就是sigmoid函数,把一个回归的连续数值压缩到了0到1的空间,其实只要有函数能够满足把数值压缩到0,1之间就可以(因为0到1之间的数值就是概率值) 对于分类…...
