
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
默认处理(SIG_DFL)忽略处理(SIG_IGN)自定义捕捉(Catch)我们知道,信号的生命周期可以简单概括为:信号产生 → 信号保存 → 信号处理其中,信号产生是整个生命周期的起点。那么,一个问题就来了:信号究竟是怎么产生的?是谁产生的?按下Ctrl+C,为什么程序会终止?执行,为什么能够杀死指定进程?程序发生除零错误,操作系统为什么会知道?调用alarm(),为什么过一段时间进程就会收到信

共享内存的核心思想非常简单:操作系统在内核中创建一块内存区域,然后让多个进程将这块内存映射到各自的虚拟地址空间中。这样一来,不同进程就能通过各自的指针,访问同一份实际的共享数据。我们可以用下面的示意图理解。注意,进程 A 和进程 B 中的指针不一定相同,但它们最终访问的是同一块共享内存。进程 A 在共享内存中写入Hello。进程 B 从共享内存中读取数据。进程 B 就能读取到Hello,不需要进程

如果你每次写 C 语言程序,都要自己实现一遍printfmallocstrlen……那该多痛苦?现实中,每个程序都要依赖大量底层的、成熟的、可复用的代码。如果每个人都从零开始写,那软件开发根本不可能有今天的规模。库(Library),就是这些“写好的、现成的、可以复用的代码”的集合。库就是一堆.o目标文件打包在一起形成的二进制文件。它不需要包含main函数(因为它是给别人用的,不是自己跑的),可以

你每天都在用 Shell:敲 、、、……但你是否想过,Shell 到底是怎么工作的?为什么能改变当前目录?为什么能把输出写到文件?为什么能打印环境变量?自己动手写一个 Shell,是理解 Linux 进程、文件描述符、环境变量、内建命令等核心概念的最佳途径。Shell 是用户和操作系统之间的“翻译官”。你输入命令,Shell 解析后,要么自己执行(内建命令),要么创建一个子进程去执行(外部命令)。

为了更好地理解虚拟地址空间,我们先讲一个生动的比喻——大富翁的私生子有一个身价 10 亿的大富翁,他有 4 个私生子,彼此互不相识,都以为自己是独生子。富翁对每个孩子都画了大饼说:“儿子,我这 10 亿资产未来全是你的!” 于是每个儿子都认为自己拥有 10 亿。当私生子 A 想要10 万的零花钱,富翁随手给了;私生子 B 想要 100 万买个车,富翁也满足了……但实际上,富翁手里总共只有 10 亿

i=1注意:等号两边不能有空格;如果值包含空格,需要用双引号或单引号包裹。什么是环境变量?环境变量是操作系统中用来指定运行环境的一些参数,以NAME=value形式存储,具有全局属性,可被子进程继承。常见环境变量有哪些?PATH(命令搜索路径)、HOME(用户主目录)、SHELL(当前 Shell)、USER(当前用户)、PWD(当前目录)等。今天的内容到这里就结束了,希望你能有所收获~干货整理到

用户级上下文:进程的虚拟地址空间,包括代码段、数据段、用户栈、共享库等。寄存器级上下文(硬件上下文):CPU 中各寄存器在某一瞬间的值,它精确描述了 CPU 当前“正在做什么、做到哪一步了”。系统级上下文:操作系统管理该进程所需的数据结构,比如进程控制块(PCB /)、页表、打开的文件描述符表、内核栈、信号处理状态等。在进程切换时,操作系统主要保存和恢复的是寄存器级上下文。

今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?

进程就是正在运行的程序,或者说是“程序的执行实例”。这个说法很直观,但不够精确。资源分配的基本单位:操作系统会把 CPU 时间、内存、I/O 设备等资源分配给进程。调度的基本单位:CPU 到底去运行哪一个进程,是按照进程为单位来切换的。用更现代一点的视角来看,进程可以拆成两部分:进程 = 内核为该进程维护的数据结构(PCB) + 进程自己的代码和数据这里的数据结构在 Linux 中就是,我们马上会

任何一台完整的计算机系统里,都包含一套最基本的程序集合,它叫做操作系统(Operating System,OS)。内核(Kernel):操作系统的核心,直接掌管硬件,负责进程管理、内存管理、文件系统、设备驱动、网络协议栈等关键模块。内核工作在最高特权级,可以执行任何指令。外壳程序与工具集:比如命令行解释器(shell)、图形界面、各种基础函数库等。它们不是内核,但为用户和程序员提供了与内核交互的便








