- 博客(29)
- 收藏
- 关注
原创 Linux系统(信号篇):信号的处理
信号处理是进程对操作系统传递信号做出响应的流程。信号处理有3种方式:默认处理(如SIGINT终止进程)、自定义捕捉(通过signal/sigaction函数注册处理函数)和忽略信号(SIG_IGN)。其中SIGKILL和SIGSTOP不可被忽略或捕捉。SIGCHLD信号用于处理子进程退出,避免僵尸进程。信号处理时机是在进程从内核态返回用户态时检查未决信号队列,根据信号类型执行相应操作。自定义信号处理时,会先返回用户态执行处理函数,再通过sigreturn返回内核态,最后恢复主流程执行。
2025-07-03 17:03:43
910
17
原创 “驽马十驾,功在不舍”——我的创作纪念日
在日常我的创作和学习是密不可分的,在学习完新知识后我会着手开始博客的创作。这样做的好处是可以加深印象,在创作的过程中如果相关领域的知识才学习完不久会发现很多知识都可以马上回忆起来,也就减少的查阅重复资料的时间。在日常博客中,我主要总结自己学习到的有关Linux系统的相关知识。在创作过程中我学习到了很多,在创作《ELF文件的定义与加载以及动静态链接》这篇文章时,我原以为ELF文件的结构都是一样的包括目标文件和可执行文件。在之后的学习过程中我会坚持更新创作更优质的博文,学习总结并提高自己的学习成果。
2025-07-01 10:42:42
259
2
原创 Linux系统(信号篇)信号的保存
本文介绍了Linux信号处理机制中的关键概念和操作函数。主要内容包括:信号递达与未决状态的区分,以及信号阻塞的概念;内核中表示信号处理的PCB结构体字段(handler、blocked、pending)及其作用;信号集数据类型sigset_t的位图实现原理;信号集操作函数(sigemptyset/sigfillset/sigaddset/sigdelset/sigismember)的功能和使用方法;sigprocmask系统调用对信号掩码的三种操作方式(阻塞/解除/设置);sigpending函数获取未决信
2025-06-27 16:22:26
796
8
原创 Linux系统(信号篇):信号的产生
在 Linux 系统中,信号(Signal)是一种软件中断机制,用于在进程间传递异步事件通知。它类似于硬件中断,但由软件层面实现,可用于通知进程某个事件已经发生,进程可根据预设规则响应或忽略这些信号。在操作系统中,信号的软件条件指的是由软件内部状态或特定软件操作触发的信号产生机制。这些条 件包括但不限于定时器超时(如alarm函数设定的时间到达)、软件异常(如向已关闭的管道写数据 产生的SIGPIPE信号)等。当这些软件条件满足时,操作系统会向相关进程发送相应的信号,以通知进程进行相应的处理。
2025-06-26 10:17:14
1029
9
原创 Linux系统:进程间通信-匿名与命名管道
本文介绍了管道在进程间通信中的两种形式:匿名管道和命名管道。匿名管道适用于具有亲缘关系的进程间通信,通过pipe系统调用创建,数据单向传输,使用内核缓冲区实现进程同步。命名管道则通过mkfifo创建文件系统可见的特殊文件,允许无关进程通过路径名访问,支持更灵活的通信场景。两种管道均采用内核缓冲机制,但命名管道具有持久性,需手动清理。文章还通过代码示例演示了两种管道的使用方法,并对比了它们在命名方式、进程关系、持久性等方面的差异,为开发者选择合适的进程通信方式提供了参考。
2025-06-09 22:37:21
882
13
原创 Linux系统:ELF文件的定义与加载以及动静态链接
ELF(Executable and Linkable Format)是类Unix系统中的标准二进制文件格式,用于存储可执行程序、目标文件和共享库。其结构包括ELF头、程序头表、节头表和数据区域,分别描述文件属性、内存布局、逻辑划分和实际内容。ELF文件的形成经历编译、汇编和链接阶段,链接器负责合并节、分配虚拟地址并修正符号引用。程序加载时,内核解析程序头表,通过mmap将段映射到进程虚拟地址空间,并利用缺页异常机制动态分配物理内存。动态链接通过地址无关代码(PIC)和全局偏移表(GOT)实现库的灵活加
2025-06-06 15:57:51
1114
14
原创 Linux系统:动静态库的制作与安装
本文介绍了Linux系统中库的基本概念与分类,包括静态库(.a)和动态库(.so)两种形式。详细阐述了静态库的创建步骤:编写源代码、编译为目标文件(.o)、使用ar命令打包,以及使用-I、-L、-l选项链接静态库的方法。对于动态库,重点说明了如何通过-fPIC生成位置无关代码和-shared选项创建动态库,并提供了4种安装方法以满足不同需求。最后对比了动静态库在链接时机、文件大小、更新维护等方面的核心差异,为开发者选择适合的库类型提供了参考依据。
2025-05-26 23:28:30
1021
15
原创 Linux系统:ext2文件系统的核心概念和结构
本节主要介绍了ext2文件系统的核心概念和结构。首先,文件系统通过“块”来提高磁盘读写效率,块是文件存取的最小单位,通常为4KB。其次,ext2文件系统引入了“块组”作为管理单元,每个块组包含超级块、组描述符、数据块位图、inode位图、inode表和数据块等部分。分区是硬盘的逻辑划分,每个分区由多个块组构成。接着,详细讲解了inode和inode表的作用,inode存储文件的元数据,而inode表是inode的集合,用于快速索引文件。数据块用于存储文件的实际内容,inode通过指针映射到数据块。此外,还介
2025-05-18 12:24:27
1164
18
原创 Linux系统:文件系统前言,详解CHS&LBA地址
本节介绍了硬盘的基本概念、组成、工作原理及其逻辑结构。硬盘(HDD)是一种使用磁性存储技术的非易失性存储设备,主要由盘片、磁头、主轴电机、控制电路板和接口等部分组成。其工作原理是通过磁头在高速旋转的盘片上移动来读取和写入数据。硬盘的存储基本单位是扇区,而多个盘片上相同位置的磁道组成柱面。硬盘的逻辑结构可以抽象为一维或三维数组,使用LBA(逻辑块寻址)地址来简化数据访问过程。此外,还介绍了CHS(柱面-磁头-扇区)寻址方式及其与LBA的相互转换,但随着技术的发展,现代系统已完全支持LBA寻址,无需进行CHS转
2025-05-13 09:40:09
806
15
原创 Linux系统:虚拟文件系统与文件缓冲区(语言级&内核级)
本节主要探讨了操作系统中“一切皆文件”的概念以及文件缓冲区的分类与工作机制。首先,通过虚拟文件系统(VFS)理解操作系统如何通过统一的文件接口管理各种外设,并介绍了文件描述符表与文件操作的关系。其次,详细分析了文件缓冲区的引入原因及其分类,包括用户级缓冲区和内核级缓冲区。用户级缓冲区通过C标准库的FILE结构体实现,支持行缓冲、全缓冲和无缓冲三种机制;内核级缓冲区则包括页缓存、块设备缓冲区和套接字缓冲区,用于优化I/O操作。最后,阐述了两级缓冲区的分层协作机制,用户级缓冲区与内核级缓冲区的协同工作减少了系统
2025-05-10 18:36:29
1319
11
原创 Linux系统:进程程序替换以及相关exec接口
进程程序替换是指用新程序的代码、数据和堆栈完全替换当前进程的地址空间(加载新程序到内存、更新页表映射、初始化虚拟地址空间,并将进程控制块(PCB)指向新程序),使进程执行新程序的逻辑,而进程ID(PID)保持不变。函数参数传递方式环境变量路径搜索示例调用execl可变参数列 表继承需完整路 径execlp可变参数列表继承支持PATHexecle可变参数列表显式传递需完整路径execv参数数组继承需完整路径execvp参数数组继承。
2025-05-02 09:17:36
970
12
原创 Linux系统:详解文件描述符与重定向原理以及相关接口(open,read,write,dup2)
我们知道,Linux系统天然支持多进程,当多个进程打开多个文件时,一方面系统会给每个打开的文件创建struct file结构体并链入到全局链表中,另一方面,每个进程PCB中都会管理和维护一张文件描述符表(本质是以struct file* 为元素的指针数组)用来指明当前进程打开了多少个文件。,用于抽象地引用进程已打开的文件、套接字(Socket)、管道(Pipe)、设备文件等I/O资源。用户对文件的操作本质是进程对文件的操作,文件的管理者是操作系统,对文件的操作是通过文件相关的系统调用接口来实现的。
2025-05-02 09:15:36
817
9
原创 Linux系统:详解进程等待wait与waitpid解决僵尸进程
进程等待是操作系统中父进程与子进程协作的核心机制,指父进程通过特定方式等待子进程终止并回收其资源的过程。这一机制的主要目的是避免子进程成为僵尸进程,从而释放系统资源并维护进程表的完整性。
2025-04-19 11:45:35
888
8
原创 Linux系统:进程终止的概念与相关接口函数(_exit,exit,atexit)
exit函数是 C 和 C++ 标准库中的一个重要函数,用于终止程序的执行,并返回一个退出状态码给父进程或操作系统。是 C 标准库中的一个函数,用于注册程序在正常终止时要执行的函数。通过atexit注册的函数只有程序通过exit或return从main函数中返回,或者调用_exit之外的终止函数时才会被调用。这里特别要注意的是, 当传入的错误码无法识别的时候strerror函数就会返回一个“Unknown error”的字符串。调用exit函数时程序会立即终止执行,后续的代码不会执行。
2025-04-19 11:44:48
926
9
原创 Linux系统:进程状态与僵尸、孤儿进程
在这里我们称当进程处于运行队列中时进程就处于运行状态,也就是说当进程处于运行队列等待被调度和占用CPU都可以称为运行状态。即:运行状态=进程占用CPU+进程处于运行队列在操作系统中,阻塞状态是进程生命周期中的一个重要阶段,表示进程因等待某种资源(如I/O操作、锁、信号等)而暂时无法执行,此时即使CPU空闲,进程也无法运行,因为所需资源尚未就绪。操作系统会保存其上下文(如寄存器状态),待事件发生后恢复执行。
2025-03-30 17:07:54
996
16
原创 数据结构:探秘AVL树
AVL树的实现引入一个平衡因子的概念(balance factor)的概念,每个节点都有一个平衡因子,任何节点的平衡因子等于右子树高度减去左子树高度,也就是说任何节点的平衡因子等于0/1/-1,AVL树并不是必须要平衡因子,但是有了平衡因子可以更方便我们去进行观察和控制树是否平衡,就像一个风向标一样。说明更新之前parent节点平衡因子为1或-1也就是左右子树一边高一边低,节点插入在低的一边,插入后左右平衡不会影响上一级节点的平衡因子。它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。
2025-03-29 19:41:29
792
12
原创 Linux系统之美:环境变量的概念以及基本操作
我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后执行可执行文件必须声明可执行文件所在的路径,路径可以是相对路径也可以是绝对路径:而如果我们不加上./也就是不加上可执行文件的完整路径,系统就会出现以下报错:表示命令行解释器(bash)无法找到该命令的可执行文件和该命令的实现方法。系统命令的实现与上述别无二致,其主要步骤如下:a、开发者使用编程语言(如C、C++、Shell等)编写命令的源代码。源代码包含了实现命令功能的逻辑和算法。
2025-03-22 10:16:44
1308
16
原创 Linux系统之美:进程初识
Bash进程是当用户登录到Linux系统并启动Bash Shell时创建的一个进程。它是用户与系统交互的主要界面,允许用户通过命令行输入命令来执行各种任务。
2025-03-15 10:12:01
1138
14
原创 逻辑的诗:类与对象(下)
内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。内部类默认是外部类的友元类。
2024-12-24 16:28:56
1163
17
原创 C++的诗行:类与对象(中)
默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后的取地址重载不重要我们稍微了解一下即可。默认成员函数很重要,也比较复杂,我们要从两个方面去学习:构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了)而是对象实例化时初始化对象。构造函数的本质是要替代我们以前Stack和Date
2024-12-18 10:23:58
936
13
原创 linux项目自动化构建工具-make/makefile
这里需要注意的是:要执行clean直接make是不行的,make默认会执行makefile文件中的第一条指令也就是编译工作,要执行clean我们需要写 make clean 指定。此时我们进行make,就会自动执行四条指令生成我们指定的四个文件(day.i、day.s、day.o、day.exe)。$@ 相当于$(BIN),$^相当于$(SRC)两者分别指代的就是day和day1.c,语法不做解释。因此有了变量只要改变变量的指向我们就可以完成大量代码中相关代码的替换,提高了我们的工作效率。
2024-12-01 12:08:28
1058
6
原创 C++入门基础
C++的第一个程序,命名空间的定义与使用,C++的输入与输出,缺省参数的定义与注意事项,什么是函数重载,引用的定义与使用以及注意事项,inline函数,nullptr
2024-11-26 10:33:37
790
10
原创 类和对象(上)
class为定义类的关键字,Stack为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者m但这也不是强制性的,具体看要求。C++中struct 也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是struct中可以定义函数,但是一般情况下我们还是推荐用class定义类。
2024-11-13 13:43:02
1102
3
原创 顺序结构二叉树——堆
树是一种非线性的数据结构,它是由有限个节点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说他是根朝上而叶子朝下的,如图:树的相关描述:节点的度: 一个节点含有的子树的个数称为该节点的度树的度: 树的所有节点的度中最大的称为该树的度叶节点或终端节点: 度为0的节点称为叶节点非终端节点或分支节点: 度不为0的节点双亲节点或父节点: 若一个节点含有子节点,则称这个节点为其子节点的父节点或双亲节点孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点兄弟节点: 具有相同父
2024-10-30 17:16:55
788
3
原创 linux权限与相关指令
学习了文件掩码便给我们设置新文件(夹)的默认权限提供了思路,这样我们可以根据不同的具体需求设置不同的umask值,以满足不同的使用场景提高我们代码的灵活性与可控性,例如开发人员可能需要更宽松的权限以便于调试,而生产环境中可能需要更严格的权限以确保安全性。首先系统会判断用户是否是该文件(夹)的拥有者,若是则返回拥有者所对应的权限,若不是拥有者则判断用户是否是或在该文件(夹)的所属组,若是则返回所属组所对应的权限,若不是所属组则用户只能是其他用户,返回other的相应权限。答
2024-10-18 12:21:38
791
2
原创 C语言数组学习总结
因为数组的元素都是内置类型的,所以如果把一维数组作为数组的元素,这个数组就是二维数组,将二维数组作为数组的元素就会得到三维数组,二维数组以上的数组统称为多维数组。在C99标准之前,C语言在创建数组的时候,数组大小指定时只能用常量和常量表达式,或者在初始化数组的时候可以省略数组的大小。此时,arr就是一个变长数组,数组的大小取决于变量n的值,编译器没法事先确定,只有运行时才可确定数组的大小,这就使得。二维数组的访问也是使用下标的形式,二维数组是有行和列的,只要确定了行和列就可以唯一确定数组中的一个元素。
2024-02-10 11:27:04
2031
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人