Linux--进程概念

article/2025/7/1 17:38:11

1.基本概念与基本操作

课本概念:程序的⼀个执⾏实例,正在执⾏的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。

2 描述进程-PCB

基本概念

进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

task_struct-PCB的⼀种

在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的⼀种数据结构,它会被装载到RAM(内存)⾥并且包含着进程的信息。

3.task_ struct

内容分类
标⽰符: 描述本进程的唯⼀标⽰符,⽤来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执⾏的下⼀条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下⽂数据: 进程执⾏时处理器的寄存器中的数据[休学例⼦,要加图CPU,寄存器]。
I∕O状态信息: 包括显⽰的I/O请求,分配给进程的I∕O设备和被进程使⽤的⽂件列表。
记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
其他信息

这里重点关注我们的程序计数器,内存指针和上下文数据。大致如图

组织进程
可以在内核源代码⾥找到它。所有运⾏在系统⾥的进程都以task_struct链表的形式存在内核⾥。

4.查看进程

4.1. 进程的信息可以通过 /proc 系统⽂件夹查看

如:要获取PID为1的进程信息,你需要查看 /proc/1 这个⽂件夹。

值得注意的是,在这个对应pid的文件夹下我们可以看到,记录了 当前进程的二进制可执行代码的路径,和当前进程的工作路径。这个工作路径可以在 Linux 下,可以使用 C 语言中的chdir函数来修改进程的工作路径。

#include <unistd.h>int chdir(const char *path);

4.2. ⼤多数进程信息同样可以使⽤top和ps这些⽤⼾级⼯具来获取

5.通过系统调⽤获取进程标⽰符

进程id(PID)
⽗进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

6.通过系统调⽤创建进程-fork初识

在Linux下,进程的增加的方式是由父进程创建子进程。
在多次运行上面代码时,我们会发现,pid一直在变化,ppid却一直没变。
其实这里是因为,我们的进程是bash的子进程。
运⾏ man fork
fork有两个返回值
⽗⼦进程代码共享,数据各⾃开辟空间,私有⼀份(采⽤写时拷⻉)
fork 之后通常要⽤ if 进⾏分流
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}

fork为什么会有两个返回值?

  • 本质:fork() 的核心作用是复制当前进程(父进程),创建一个几乎完全相同的新进程(子进程)。这两个进程从 fork() 调用的下一行代码开始并发执行。
  • 返回值的作用:为了让父进程和子进程能够区分自己的身份,fork() 在两个进程中返回不同的值:
    • 在父进程中:返回子进程的进程 ID(PID,一个正整数)。
    • 在子进程中:返回 0
    • 若出错:父进程返回 -1,且不会创建子进程。

两个返回值各种给⽗⼦如何返回?

  • 执行流程:
    1. 父进程调用 fork(),内核创建子进程。
    2. 父进程继续执行,fork() 返回子进程的 PID(正整数)。
    3. 子进程从 fork() 的返回处开始执行,fork() 返回 0

为什么设计这样的返回值?
  • 子进程通过 0 确认身份:子进程可以直接通过 if (pid == 0) 判断自己是子进程。
  • 父进程需要子进程的 PID:父进程通常需要管理子进程(如等待子进程结束、发送信号),因此返回子进程的 PID 便于操作

http://www.hkcw.cn/article/ZFsRcfENRh.shtml

相关文章

铁电液晶破局 VR/AR:10000PPI 重构元宇宙显示体验

一、VR/AR 沉浸感困境&#xff1a;传统显示技术的天花板在哪&#xff1f; &#xff08;一&#xff09;纱窗效应与眩晕感&#xff1a;近眼显示的双重枷锁 当用户戴上 VR 头显&#xff0c;眼前像素网格形成的 “纱窗效应” 瞬间打破沉浸感。传统液晶 500-600PPI 的像素密度&…

edge进行重置设置之后,网页无法访问(显示连接不是专用连接)

问题&#xff1a; edge进行重置设置之后&#xff0c;网页无法访问&#xff08;显示连接不是专用连接&#xff09;&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 调整键盘为英文输入状态&#xff0c;刷新一下页面&#xff0c;鼠标点击页面任意位置&#xff08;不要点击到…

sql注入补充——get注入

Sql注入 Mysql中的information_schema库 用于存储数据库元信息&#xff0c;包含了数据库、表、列、索引等结构化信息。 特点&#xff1a; 只读性 标准化&#xff1a;它是sql标准的一部分&#xff0c;适用于多种数据库系统 动态生成&#xff1a;数据是动态生成的&#xff…

eBay关键词搜索API开发指南

一、接口概述 eBay的Finding API提供findItemsByKeywords方法&#xff0c;支持通过关键词检索商品列表。该接口采用REST架构&#xff0c;返回标准JSON/XML格式数据&#xff0c;日均调用限额5000次&#xff08;生产环境需申请提升配额&#xff09;。 二、核心参数说明 必需参…

<6>, 界面优化

目录 一&#xff0c;QSS 1&#xff0c;背景介绍 2&#xff0c;基本语法 3&#xff0c;设置方式 &#xff08;1&#xff09;指定控件样式设置 &#xff08;2&#xff09;全局样式设置 &#xff08;3&#xff09;从文件加载样式表 &#xff08;4&#xff09;使用 Qt Desig…

截图工具 Snipaste V2.10.7(2025.06.2更新)

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORklK9hcuoI6n_qgx25jSq2A1?pwde7bi# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/7c62f8f86735 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

Docker安装Redis集群(3主3从+动态扩容、缩容)保姆级教程含踩坑及安装中遇到的问题解决

前言 部署集群前&#xff0c;我们需要先掌握Redis分布式存储的核心算法。了解这些算法能帮助我们在实际工作中做出合理选择&#xff0c;同时清晰认识各方案的优缺点。 一、分布式存储算法 我们通过一道大厂面试题来进行阐述。 如下&#xff1a;1-2亿条数据需要缓存&#xff…

Altium Disigner(16.1)学习-元器件封装

一、元器件封装 封装就是给画的原理图所有的器件的外形描述出来&#xff08;几个引脚啦、引脚之间的长度啦、宽度啦&#xff09;&#xff0c;一定要精确。否则等到真正元器件焊在板子上的时候&#xff0c;会发现根本焊不上去&#xff0c;可能就是焊盘的位置不够精确。 可以点击…

初识CSS3

1. 什么是CSS <style>标签 行内样式 内部样式表 外部样式表⭐ CSS样式优先级⭐ 2. CSS3基本选择器 标签选择器 类选择器 ID选择器 基本选择器的特点⭐ 基本选择器的优先级⭐ 3. CSS3高级选择器-层次选择器 后代选择器 子选择器 相邻兄弟选择器 通用兄弟选择器 4. CSS3高级…

Python训练营---Day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 数据集来源水母图像数据集 --- Jellyfish Image Dataset&#xff0c;对水母图片进行分类&#xff0c;共6个类别。 数据集文件…

NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)

自然语言处理&#xff08;NLP&#xff09;的核心挑战在于让机器“理解”人类语言。传统方法依赖独热编码&#xff08;One-hot Encoding&#xff09; 表示单词&#xff0c;但它存在严重缺陷&#xff1a;每个单词被视为孤立的符号&#xff0c;无法捕捉词义关联&#xff08;如“国…

win32相关(事件)

事件 什么是事件&#xff1f; 事件是指系统或应用程序中发生的特定动作或状态变化&#xff0c;这些动作或变化可以被程序检测并响应。Windows 采用事件驱动的编程模型&#xff0c;应用程序主要通过处理各种事件来与用户交互 我们来看一下事件的函数 HANDLE CreateEventW(LPSE…

VisionPro项目记录3 —— 圆心距

简介&#xff1a;本项目实现基于Cognex视觉系统的两圆心对位功能&#xff0c;使用一个圆作为基准&#xff0c;另一个圆进行补偿&#xff0c;输出偏移值给PLC或机械手。 系统采用CogFindCircleTool定位两圆心坐标&#xff0c;通过脚本计算圆心距并乘以缩放系数kValue&#xff0…

面向连接的运输:TCP

目录 TCP连接 TCP报文段结构 往返时间估计与超时 可靠数据传输 回退N步or超时重传 超时间隔加倍 快速重传 流量控制 TCP连接管理 三次握手 1. 客户端 → 服务器&#xff1a;SYN 包 2. 服务器 → 客户端&#xff1a;SYNACK 包 3. 客户端 → 服务器&#xff1a;AC…

使用Python进行函数作画

前言 因为之前通过deepseek绘制一下卡通的人物根本就不像&#xff0c;又想起来之前又大佬通过函数绘制了一些图像&#xff0c;想着能不能用Python来实现&#xff0c;结果发现可以&#xff0c;不过一些细节还是需要自己调整&#xff0c;deepseek整体的框架是没有问题&#xff0…

C#项目07-二维数组的随机创建

实现需求 创建二维数组&#xff0c;数组的列和宽为随机&#xff0c;数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …

java Semaphore‌

Java Semaphore 用于控制同时访问特定资源的线程数量&#xff0c;通过管理一组“许可”&#xff08;permits&#xff09;实现并发限制。 模拟6人上厕所&#xff0c;但只有两个坑位&#xff0c;测试代码&#xff1a; import java.util.concurrent.Semaphore;// 假设厕所只有俩…

代码随想录算法训练营第60期第五十五天打卡

大家好&#xff0c;我们今天继续我们图论的部分&#xff0c;其实我们昨天是主要讲解了深搜与广搜的理论基础&#xff0c;我们大体上了解了两种算法的差异与适用情景&#xff0c;今天我们就继续我们的图论的章节&#xff0c;以后几天的题目是图论中比较有名的问题叫做岛屿问题&a…

【音视频】FFmpeg 编码H265

一、概述 实现了读入本地yuv文件&#xff0c;通过libx265编码为H265格式&#xff0c;并存储到本地文件中 二、实现流程 准备文件 在build路径下准备yuv文件 在项目中添加文件参数&#xff0c;输出为h265文件&#xff0c;使用libx265编码 初始化解码器 通过传进来的libx265…

贪心算法应用:带权任务间隔调度问题详解

贪心算法应用&#xff1a;带权任务间隔调度问题详解 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。带权任务间隔调度问题是贪心算法的一个经典应用场景。 问题定义…