- 博客(19)
- 收藏
- 关注
原创 (Linux)ELF格式与库的链接原理
在Linux下,以.o后缀的目标文件、.so后缀的动态库文件、可执行文件等都是二进制文件,它们有一个共同的格式——可执行可链接格式,简称这些文件也被称为。示意图如下这些文件在磁盘中就是以这种格式存储的。其中ELF Header(ELF 头) 是 ELF 文件结构的核心和起点,它描述了整个文件的组织结构和基本信息。使用命令readelf -h [文件名]可以查看 ELF Header,第一行的magic(魔数)就是用于识别该文件是不是ELF文件的。
2025-11-07 14:40:28
987
原创 (Linux)Ext文件系统
为了更好地理解Ext文件系统(下称文件系统),需要先了解一下外存的知识,主要是了解其中的基本存储单元的概念,下面以机械硬盘为例。
2025-09-24 11:59:58
1025
1
原创 (Linux)文件操作与基础IO
文件存放在磁盘中,而磁盘是永久性存储介质,故文件可以永久地存储在磁盘中。磁盘是一种外设,既是输入设备也是输出设备。对磁盘上文件的所有操作都是对外设的输入和输出,简称文件由两部分组成,一是文件内容,二是文件属性,所以即使是空文件也会占用磁盘空间。文件操作本质就是文件内容操作和文件属性操作。文件在磁盘中,磁盘又是硬件,由操作系统管理,所有,但没有进程时,。具体就是通过文件相关的系统调用接口进行文件操作。
2025-09-17 08:59:32
869
原创 (Linux)进程控制
本文介绍了进程控制的核心概念和操作。首先讲解进程创建,指出fork函数会创建子进程并触发写时拷贝机制;其次说明进程退出的具体细节;然后详述进程等待机制,重点解析wait和waitpid函数的使用方法,包括阻塞/非阻塞等待方式;最后阐述进程程序替换,介绍exec函数族的功能和命名规则,说明如何通过exec函数调用外部程序。
2025-09-02 12:34:21
724
原创 (Linux)程序地址空间与虚拟地址
内核空间部分用于系统调用。事实上,进程地址空间也是个类似进程PCB的数据结构,在Linux中,它是一个结构体,叫做mm_struct,里面包含了各个区域起始位置和终止位置的地址,通过起始地址和终止地址即可访问区域内的空间,这些地址也是虚拟的。子进程的页表是拷贝自父进程的,代码和数据也是拷贝自父进程,甚至可能是和父进程共用的。前面的例子中子进程修改了数据,触发了写时拷贝,写时拷贝虽然会开辟新的空间,但不会生成新的虚拟地址,只是修改子进程的页表,将虚拟地址0x60104c对应的物理地址改成新开辟的空间。
2025-08-22 19:31:47
618
原创 (Linux)环境变量
就是用于临时存储输入的命令行参数。上面的命令中是直接给出了可执行文件code的路径,如果是像 ls 之类的指令,bash则会通过环境变量表中的PATH寻找对应的可执行文件。最后还可以使用头文件unistd.h中的全局变量environ,它是以NULL结尾的指针数组,数组中的指针指向的就是环境变量块中的各个环境变量,通过它可以查看当前进程全部的环境变量。但我们知道:进程之间具有独立性,进程之间不能相互修改数据,export应该是不能修改环境变量的,因为环境变量是进程bash中的数据,那它是如何做到的呢?
2025-08-20 18:32:03
609
原创 (Linux)进程
简单来说,所有正在运行的程序都叫进程,包括各种命令和操作以及我们运行的可执行文件。进程也是需要管理的,和管理硬件的方法一样,操作系统为每个进程都创建了一个数据结构,叫做,里面存储了进程的各种信息和指向进程的代码(其实已是二进制指令)和数据的指针,并用双向链表存储所有PCB的指针,通过管理PCB进而管理进程。所以准确来说,操作系统内核中的数据结构(PCB)和内存中的代码和数据二者合在一起才是进程。Linux下的PCB叫做task_struct,本质就是一个结构体。接下来,我们将基于Linux系统理解进程。
2025-08-20 10:04:22
1753
原创 (进阶数据结构)图论
介绍了图的基本概念和相关算法。首先阐述了图的定义、分类(有向图/无向图)以及顶点、边、路径等核心概念。然后详细讲解了两种图的存储方式:邻接矩阵和邻接表,并分析了它们的优缺点。在算法部分,介绍了图的遍历(BFS/DFS)、最小生成树构造(Kruskal和Prim算法)以及最短路径问题(Dijkstra、Bellman-Ford和Floyd-Warshall算法)。
2025-08-17 10:50:56
501
原创 (进阶数据结构)并查集
假设有一群人,给出所有的交友关系(即哪两个人要交朋友),且朋友的朋友可以作为盟友,据此将这群人划分为不同的团体。核心思想是用数字给这些人编号,然后将一个团体中的任意一人看作老大,其他人看作他的下属,检查两个人是否属于一个团体就看最上面的老大是不是相同的人。如果出现两个团体要合并时,就把其中一个团体的老大改成另一个老大的下属,如下图,2和4要交朋友,就让3变成0的下属,或者让0变成3的下属。下图是让0变成3的下属。
2025-07-28 19:08:41
307
原创 计算机运行大致原理
在当下,我们几乎无时不刻地在和计算机打交道。我们使用计算机打开各种软件来发送消息、打游戏、写文章。但是这些软件或者程序是如何在计算机上运行起来的?操作系统是什么?它在这里面发挥着什么作用?为了回答这些问题,我们先从计算机硬件的大致结构讲起。冯诺依曼结构
2025-07-20 21:09:41
589
原创 (算法题)N个数求和
这题的最坏情况数据量非常大,开始时总是考虑最坏情况如何处理,但实际上并没有最坏情况。有时候并不是题目很难,而是我们自己为难自己。今后如果碰到最坏情况几乎无法处理,不妨试试只考虑大多数情况。
2025-07-04 13:49:40
609
原创 (Linux)gcc编译器的使用
如果我们在代码中使用了自己定义的函数,并且函数的定义在其它文件,那么代码就不能直接生成可执行文件了。例如我们现在有四个文件code.h、 code1.c、 code2.c、 code3.c,在文件code1.c中有下面这段代码其包含的头文件code.h中只有函数func1()和func2()的声明,具体的定义分别在另外两个文件code2.c和code3.c中,具体内容如下code3.c。
2025-07-02 14:09:34
872
原创 (Linux)make的使用与Makefile文件的编写
名字叫Makefile的文件就是Makefile文件,M也可以是小写。make是一个命令,用于生成文件。二者用于大型项目中快速处理文件。我们从基础部分开始,make的使用格式是make [目标文件]要生成文件,肯定要给出生成该文件的方法,生成方法要写在Makefile文件中。使用make命令就要在当前的路径下创建并编写Makefile文件,make命令会根据Makefile文件中的内容生成目标文件。
2025-07-01 20:49:06
980
原创 (算法题)连续因子
题目要求找出正整数N的最长连续因子序列及其最小因子。主要思路是暴力解法:从2到√N范围内遍历每个数作为连续因子起点,计算其连续因子个数,记录最长序列。若N为质数,则直接输出N本身。时间复杂度分析表明该方法可行(最多2×10^6次运算)。代码实现时需注意处理大整数溢出问题(使用long long类型)。关键点在于连续因子的乘积能被N整除,且最长序列长度不超过13(因13! > 2^31)。最终输出最长连续因子个数及最小连续因子序列。
2025-06-30 15:36:47
765
原创 (Linux)库的基本理解
【摘要】库是包含常用功能或数据的文件集合,分为动态库和静态库。动态库通过动态链接在程序运行时调用,需要将库加载到内存;静态库通过静态链接将代码直接嵌入程序,无需保留原库但占用空间更大。库命名以lib开头,如动态库libc.so.2.77,静态库libc.a。使用gcc编译时可选择动态链接(默认)或静态链接(加-static选项)。通过ldd命令可查看程序依赖的动态库。静态链接生成的文件更大,但运行时不再依赖原库。
2025-06-29 17:14:58
403
原创 (Linux)权限的基础理解
摘要:Linux系统通过权限机制保护文件安全,分为超级用户(root)和普通用户。文件权限包括读(r)、写(w)、执行(x)三种,分别针对文件拥有者(u)、所属组(g)和其他用户(o)。使用chmod命令可修改权限,支持增加(+)、减少(-)和赋予(=)操作。chown和chgrp命令分别用于更改文件拥有者和所属组。合理设置权限可以防止机密文件被非法访问或篡改。
2025-06-25 17:52:39
957
原创 (C语言)指针的初步了解与深入解析
我们首先需要了解地址的概念。计算机的内存就像一个大酒店,里面的每一个房间都有特定的编号,相应的,内存由一个个存储单元组成,其中的每一个存储单元都有自己的地址,存储单元的大小一般是一个字节。计算机会为我们创建的每一个变量分配一块内存的空间用于存放变量的值,这些空间都由相邻的存储单元组成。变量的地址就是这块空间的第一个存储单元的地址。有了地址,计算机就能快速地找到对应的存储单元,以便于进行后续的操作。而指针变量就是用于存储这些地址的变量。
2024-03-30 21:38:14
2112
原创 (C语言)扫雷游戏简单化实现的思路讲解与演示
确定扫雷游戏的实现方式后,我们就可以着手完成各种需要用到的函数了,之后再在main函数中进行组装。先从最简单的输出开始。由于每次输入坐标后,输出的部分(玩家看到的扫雷图,即数组display的内容)都会发生变化,为了不重复地写用于输出数组display内容的代码,我们定义一个新函数show,使得将数组传入后即可完成数组内容的输出。
2024-01-17 17:35:26
1841
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅