尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Linux 进程(二) 深入理解进程
目录一. 理解系统调用二. 理解库函数三. 理解进程3.1 初步了解进程3.2 描述进程 PCB(进程控制块)3.2.1 task_struct 包含的核心内容3.3 组织进程3.4 查看进程3.4.1 getpid 和 getppid代码示例3.4.2 ps代码示例3.4.3 top3.4.4 /proc代码示例3.4.4.1 两个重要的属性execwdchdir3.5 杀掉进程3.5.1 ctrlc3.5.2 kill四. 父进程与子进程4.1 命令行解释器 bash4.2 创建进程 fork代码示例4.2.1 fork 的返回值4.2.2 三个重要的问题为什么 fork 给父子进程的返回值不一样为什么一个函数会返回两次为什么同一个变量即0又大于0导致if else同时成立一. 理解系统调用我们在学习操作系统的时候知道操作系统通过管理软硬件的资源来为用户、程序提供更好的执行环境。但是操作系统却不相信任何用户。我们可以举银行的例子来帮助我们理解银行是给用户服务的但是银行却不相信任何用户你得通过窗口提供各种资料才行操作系统也是如此通过系统调用让用户和操作系统实现交互。二. 理解库函数依旧是银行的例子我们发现光有窗口还不够对于不熟悉的用户来说会有专门的引导者去帮助用户同样的库函数就像是引导者帮助用户进行对应的系统调用例如C语言中常用的printf函数底层就调用了系统提供的函数接口write,但是我们为什么看不见呢因为有人对其进行了封装。但是并不是所有的库函数都进行了函数调用我们可以通过有没有访问我们的硬件来做出判断因为访问了我们的硬件必然经过操作系统而与操作系统交互必然要经过系统调用三. 理解进程3.1 初步了解进程在了解进程之前我们不妨把整个流程推导一下首先我的磁盘有一个可执行文件cmd运行该文件时会先把cmd加载到内存当中此时内存除了可执行文件还有操作系统我们操作系统对这些可执行程序必然是要做出管理的(因为操作系统的作用就是管理软硬件资源)我们之前也说了管理就是先描述再组织。我们继续一步步来理解描述就是在操作系统中对每一个可执行程序都会定义一个结构体XXX结构体里面记录着程序的相关属性信息。那么假设有n个可执行程序加载到内存当中那么在操作系统中就会形成n个节点每个节点都有对应指针指向内存中的可执行程序。组织我们这里假设以链表的形式组织这就形成了一个进程列表。那么进程又是什么呢进程就是内核数据结构对象加载到内存中的可执行程序。3.2 描述进程 PCB(进程控制块)我们在上文提到了内核中会创造结构体记录进程的相关信息这个数据结构我们称之为进程控制块简称PCB(process control block)而在linux下该结构体的名称称为 task _struct我们之前提到操作系统有进程的管理这实际上是对PCB的管理而不是对代码数据也就是传输到内存的可执行文件做管理3.2.1 task_struct 包含的核心内容我们之前说了进程控制块里面记录着进程的相关信息接下里我们就来看看记录了进程的哪些属性信息标示符描述本进程的唯一标示符用来区别其他进程。状态任务状态退出代码退出信号等。优先级相对于其他进程的优先级。程序计数器程序中即将被执行的下一条指令的地址。内存指针包括程序代码和进程相关数据的指针还有与其他进程共享的内存块的指针。上下文数据进程执行时处理器的寄存器中的数据体会例子要加图 CPU、寄存器。I/O 状态信息包括显示的 I/O 请求分配给进程的 I/O 设备和被进程使用的文件列表。记账信息可能包括处理器时间总和使用的时钟总数和时间限制记账等。其他信息。具体详细信息后续会介绍。3.3 组织进程组织进程就是操作系统通过一定的数据结构将各个进程的 PCB 组织起来方便对进程进行查找、管理和调度。3.4 查看进程3.4.1 getpid 和 getppidgetpid() 和getppid() 都是 Linux 中常用的进程接口。getpid()获取当前进程的 PID就是我们在task_struct包含内容中提到的进程标识符。getppid()获取当前进程的父进程 PID。getpid 和 getppid是系统提供的函数接口我们通过man手册也可以发现它给我们翻到第二册—系统调用代码示例3.4.2 pspsProcess Status是 Linux 中用于查看当前系统进程信息的指令。简单来说就是查看系统中有哪些进程正在运行以及它们的相关属性。关于ps 的更多选项介绍我们以后再讨论这里只是简单见识一下。代码示例在 Linux 中如果想要一次性执行多个指令可以使用 和 分隔。;前一个指令执行完就执行下一个。前一个指令执行成功才执行下一个。3.4.3 toptop是 Linux 中用于实时查看系统运行状态和进程资源占用情况的指令。按q退出 top。3.4.4 /proc/proc目录下记录着当前系统里所有进程的信息而该目录下的所有数字目录上的数字都是对应进程的PID数字目录里面的内容就是对应的进程进行时的动态属性。代码示例3.4.4.1 两个重要的属性exe/proc/PID/exe记录准确来说是指向该进程对应的可执行文件路径。如果我把对应的可执行文件删除很大程度上对进程不会有影响因为我只是把磁盘上的文件删除了并没改变内存上的代码数据。但是我们再次查看exe会发现被标注deletedcwdcwd指向的是当前进程的工作目录当我们在当前目录下执行touch hallo时为什么文件会默认创建在当前目录下呢这是因为运行touch程序时会创建对应的进程该进程会继承 Shell 的当前工作目录并通过cwd记录这一信息。当我们没有指定文件的绝对路径而是使用相对路径hallo时操作系统就会以该进程的当前工作目录cwd为起点解析路径因此文件默认会创建在当前目录下。chdirchdir是 Linux 中的一个系统接口用于改变当前进程的工作目录cwd。3.5 杀掉进程3.5.1 ctrlc我们之前说过我们可以用 ctrlc 来终止异常同样的我们也可以用它来终止正在运行的程序。3.5.2 killkill是Linux 中用于向指定进程发送信号的指令常用于终止进程。1. kill PID - 默认发送 SIGTERM15号信号。 - 请求进程正常退出。 - 进程可以处理或忽略该信号。 - 进程可以在退出前进行资源清理。 2. kill -9 PID - 发送 SIGKILL9号信号。 - 强制终止进程。 - 进程无法捕获、忽略或阻塞该信号。 - 进程没有机会自行执行清理操作。这里选项 -9 涉及信号的知识我们后面会学到这里就不再说明了解大概用法即可四. 父进程与子进程在 Linux 中绝大多数进程都是由其他进程创建的因此进程之间通常存在父子关系。还记得我们之前提及的进程接口gitppid吗,我们可以用这个验证一下但是这个父进程到底是什么呢我们会发现这个父进程对应的指令是bash那么显而易见 ./myprocess就是子进程而bash是父进程。我们之前也说了当有新命令来时命令行解释器本身并不会去执行而是会创建子进程去执行我们现在再来看这段话就好理解了。4.1 命令行解释器 bash我们前几章在讲shell与内核交互的时候已经了解过命令行解释器bash这里就不再赘述。我们主要再来了解几个相关的知识点。在 Linux 中当用户登录并进入命令行环境时操作系统通常会为该终端会话启动一个 Shell 进程例如 Bash用于接收、解析和执行用户输入的指令。需要注意的是同一个用户登录多个终端通常会拥有多个独立的 Bash 进程当使用su切换用户时通常也会启动一个新的 Shell 进程而原来的 Shell 仍然保留。4.2 创建进程 forkfork是 Linux 中用于创建子进程的系统调用。代码示例当父进程调用fork()创建子进程时操作系统会为子进程创建一个新的 PCB进程控制块我们可以暂时将其理解为对父进程 PCB 的拷贝。子进程会继承父进程的大部分属性信息但部分属性会发生变化例如 PID、PPID 等。另外子进程刚创建时并不会立即完整复制一份父进程的代码和数据而是与父进程共享相同的代码和数据内容。因此在初级阶段我们可以简单理解为子进程拥有自己的 PCB但最初与父进程共享代码和数据。所以对子进程、父进程而言都会执行代码 printf(进程开始运行pid:%d\n,getpid)我们最终会看到两种输出结果。4.2.1 fork 的返回值fork()创建成功时会返回两次父进程获得子进程的 PID子进程获得0如果创建失败则返回-1不会创建子进程同时设置errno记录具体的错误原因。所以我们其实可以利用fork让父/子进程执行不同的代码块4.2.2 三个重要的问题为什么 fork 给父子进程的返回值不一样父进程和子进程之间是1:n的关系即一个父进程可以创建多个子进程。因此父进程需要获得每个子进程的 PID以便区分和管理不同的子进程。而子进程通过fork()的返回值为 0便可以判断自己是子进程。为什么一个函数会返回两次我们先来简单看看 fork 的内部实现fork 的核心功能确实是创建子进程。内核在 fork 内部完成子进程创建之后父进程和子进程都会从 fork 调用结束的位置继续往下执行所以看起来就像 fork “返回了两次”。但更准确地说并不是一个进程把 return 执行了两次而是父进程和子进程这两个执行流各自从 fork 返回了一次父进程拿到的是子进程的 PID子进程拿到的是 0。为什么同一个变量即0又大于0导致if else同时成立虽然我们前面理解了 return 会双进程而执行两次但是 id 是怎么做到接收两个值的呢我们先来理解一个点进程具有独立性我们之前说过进程 PCB 数据代码就PCB而言子进程和父进程都有自己独立的PCB,不会互相影响代码虽然我们共用但是对于父子进程而言代码是只读不能修改的对数据来说父子任何一方要对数据进行修改OS都会把被修改的数据在底层拷贝一份让目标进程修改这个拷贝这个技术我们称之为写时拷贝。
RELATED

相关推荐

【三个月 AI Agent 实战学习】Day 56:作品集整合 —— 个人 AI Agent 作品集网站与项目演示脚本

【三个月 AI Agent 实战学习】Day 56:作品集整合 —— 个人 AI Agent 作品集网站与项目演示脚本

Day 56:作品集整合 —— 个人 AI Agent 作品集网站与项目演示脚本 欢迎来到第五十六天!过去三天我们完成了简历和两轮模拟面试。但简历和面试只是“说”,面试官和招聘方还需要“看”——他们想看你的代码、项目演示、架构图。今天我们将把你…

📅 2026/11/4 16:27:13
海事网关连接船载受控网络与岸端平台:安全边界与数据发布架构设计

海事网关连接船载受控网络与岸端平台:安全边界与数据发布架构设计

摘要: 船载受控网络连接岸端平台,不应被简单设计成一条“船端内网到公网”的链路。岸端可能需要设备状态、告警、文件、API和远程维护能力,而这些需求对应的网络权限并不相同。海事网关设计的重点,是把船端主动发布、对外服务和岸…

📅 2026/11/4 16:27:13
生成式对抗网络GAN(Generative Adversarial Network)

生成式对抗网络GAN(Generative Adversarial Network)

network作为generator生成更加复杂的distribution,应该怎么做?这是我们这节课要讨论的问题generative model适用于哪些场景呢?简单来说,就是输出需要一些“创造力"的时候,例如绘画,聊天机器人等在norm…

📅 2026/11/4 16:22:12
MORE NEWS

更多资讯

📰

中国模型反向收费美国巨头:技术授权与按量分成实战

1. 从“免费换量”到“按量收费”的转折点 “这一次,中国模型开始收美国巨头的钱”——这句话第一次看到的时候,我正蹲在工位上啃三明治,差点没噎着。做了七八年AI应用层开发,我太清楚过去几年国内大模型厂商在海外的处境了&#…

📰

Claude Code 报错排查:ECONNRESET 与 API ERROR

某天下午,我在终端里敲下claude,回车,光标闪了两下,正准备把一段两百行的重构需求贴进去,屏幕上先甩出来一行红字:Unable to connect to API (ECONNRESET)。再试一次,变成API ERROR,…

📰

Oracle 11gR2 Linux单机安装全流程与翻车点排查

简介:面向Linux平台Oracle数据库部署学习者的11gR2单机安装图解文档,针对单机环境安装流程复杂、依赖配置易出错的问题,提供从前期准备到建库收尾的系统参考,适合具备一定Linux与数据库基础的运维和开发人员。资源包共1个doc文档&…

📰

移动端WebView虚拟按键适配方案:原生与H5混合实践

1. 问题背景与现状分析 在移动端混合开发中,WebView与原生组件的交互一直是个棘手问题。特别是当设备底部存在虚拟导航栏时,H5页面底部的Tabbar经常会被遮挡,导致用户无法正常操作。这个问题在全面屏设备上尤为突出,因为不同厂商的…

📰

codex接入中转站API无法生成图片:本地适配层排查与归一化方案

最近碰到一个挺典型的事:有朋友把 codex 的接口地址换成了第三方中转服务,聊天、补全、改代码都正常,唯独让他画张图,不是回一句"当前模型不支持图像生成",就是终端里吐半行链接然后卡死。他那套 key 拿去别…

📰

DeepSeek V4.1 Flash实测:低成本高响应的轻量级模型部署与集成指南

刚把 DeepSeek V4.1 Flash 接到工作流里的那一周,我最大的感受是:这个型号把很多我以为“得靠满血版硬顶”的活,悄悄接过去了。标题说它“有点不一般”,不是在吹,而是它在成本、速度、产出质量三条线上同时给出了一些惊…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬