一、目录的本质:不仅仅是个文件夹
都说 Linux 下一切皆文件,那目录到底是不是文件? 答案是:必须滴! 因为它也有自己的 inode。不信? 跑个 ls -i
命令看看,inode 编号是不是稳稳地在那儿?
目录里都藏了些啥秘密? 其实就是一堆文件名和 inode 的映射关系。 操作系统靠这个才能在茫茫“文件海”中找到你要的文件。
每个目录一出生就自带俩“隐藏款”文件:.
和 ..
。 它们是啥? 属性是啥? 别急, 往下看, 保证给你安排得明明白白!
二、软链接:Windows 快捷方式的 Linux 版?
先来个骚操作, 用 ln -s
给 test 目录整个软链接:
看到没? 软链接也有自己的 inode, 妥妥的独立文件一枚! 它的数据块里其实存的是指向文件的路径。
软链接就像 Windows 里的快捷方式, 对它动手动脚, 原文件也会跟着变。
但是! 如果原文件被咔嚓掉了呢?
Duang! 软链接直接变红, 宣告“已失效”。 所以, 软链接对原文件可是有依赖性的哦! 原文件没了, 它也就凉凉了。
三、硬链接:文件界的“克隆”技术
用 ln
命令创建硬链接:
注意看, 硬链接和原文件的 inode 一模一样! 前面我们提到过, 第三列的数字 2 代表硬链接数。 现在是不是瞬间明白了? 硬链接数就是指向同一个 inode 的文件名数量。
修改 file 文件, 硬链接也会跟着变, 因为它们压根就是同一个文件!
就算把 file 文件删了, 硬链接依然坚挺, 数据也不会丢! 这再次证明了: 操作系统只认 inode, 不认文件名!
inode 结构体里有个引用计数器, 记录着硬链接数。 只要引用计数大于 0, 所有硬链接就都指向同一块存储空间。
但是! Linux 并不允许你随便给目录创建硬链接。 为啥? 原因有四:
- 防止文件系统循环引用: 目录 A 硬链接到目录 B, 目录 B 又硬链接回目录 A, 无限循环, 系统直接崩溃!
- 保证文件系统一致性: 目录结构必须清晰, 乱搞硬链接会破坏目录的层次关系, 让文件管理变得一团糟。
- 简化文件系统管理: 目录的硬链接会让链接计数变得异常复杂, 增加文件系统维护难度。
- 安全性考虑: 目录权限管理是基于目录结构的, 乱用硬链接可能绕过权限控制, 造成安全隐患。
四、Linux 目录里的秘密:.
和 ..
是什么鬼?
1、.
:我就是我,不一样的烟火
.
的作用是啥? 定位当前目录! 有了它, 才能用 ./
搞相对路径定位。 看图, test 目录和 test 目录里的 .
的 inode 是一样的, 这其实就是个硬链接! 虽然 Linux 不让你手动创建目录硬链接, 但为了方便你用相对路径, 它偷偷给你安排了一个。 而且, 这还是个隐藏文件, 默认情况下你看不到它。
2、..
:带你回到上一次
..
的 inode 和 2_9 目录里的 .
的 inode 相同! 所以, ..
其实就是上级目录 2_9 的硬链接。 现在, 当你在 test 目录下执行 cd ..
命令时, 是不是感觉像坐上了时光机, 嗖地一下回到了 2_9 目录?
五、静态库:编译时的一次性“打包”
1、手把手教你打造静态库
假设我们有两个 .o
文件: 一个负责打印功能, 一个负责加减乘除。 现在要把它们打包成一个静态库。
来解读一下 Makefile:
lib=mylib.a
: 定义静态库的文件名。$(lib):cal.o print.o
: 声明静态库依赖于cal.o
和print.o
。ar -rc $@ $^
: 核心命令! 把所有依赖文件 ($^
) 打包成静态库 ($@
)。- 后面的规则负责把
.c
文件编译成.o
文件。 output
目标则负责把静态库和头文件整理到特定的目录结构中, 方便发布和管理。
记住: 静态库 .a
文件其实就是一堆 .o
文件的“压缩包”。
执行 make
命令生成静态库, 再执行 make output
发布库。 然后把生成的静态库复制到 test 文件夹里, 准备开始测试。
2、静态库的正确打开方式
What? 报错了! 找不到 cal.h
头文件。 还记得 C 语言包含头文件的两种姿势吗?
<>
: 去系统指定的目录里找。""
: 在当前目录里找。
现在头文件在 lib/include
目录下, 既不在系统目录, 也不在当前目录, 咋办? 三种方案:
- 把代码里的路径补全。
- 把头文件拷贝到系统指定目录(
/usr/local/include/
或/usr/include
)。 - 用
-I
选项告诉编译器头文件在哪。
这里我们选择第三种:
头文件的问题是解决了, 但还是编译不过! 因为链接器找不到库文件。 gcc 默认只在 lib64/libc.so
和 lib64/libc.a
里找, 我们的库文件藏在其他地方, 必须手动指定。
解释一下这行命令:
-I ./lib/include
: 指定头文件搜索路径。-L ./lib/mylib/
: 指定库文件搜索路径。-lmylib
: 指定要链接的库名(注意: 这里是mylib
, 不是libmylib.a
)。
除了这种方式, 还有两种“骚操作”:
- 安装库: 把头文件复制到
/usr/include
, 库文件复制到/lib64
。 - 建立软链接: 类似于路径补全, 不过需要在代码里写成
#include <mysoftlink/cal.h>
这种形式。
现在, 编译成功了! 但是, 如果把静态库删掉, 程序还能跑吗? 自己试试看!
六、动态库:运行时按需加载的“共享”资源
1、动态库“炼成”记
还是用之前的代码, 这次我们来生成动态库。
注意两个关键选项:
-fPIC
: 必须有! 生成与位置无关的代码, 让动态库可以加载到任意内存地址。-shared
: 告诉 gcc 我要生成动态库(也叫共享库)。
2、动态库的正确食用方法
把动态库放到 test 文件夹里, 创建 main.c
测试文件。 编译时又遇到了头文件找不到的错误, 解决方法和静态库一样, 这里不再赘述。
按照静态库的方式链接动态库, 发现虽然生成了可执行文件, 但是运行时却找不到动态库!
用 ldd a.out
命令查看可执行文件 a.out
依赖的库, 发现动态库那里显示 not found
。
用 file a.out
命令可以看到 a.out
确实是 dynamically linked, 依赖于共享库。
解决这个问题, 有四种方法:
- 拷贝到系统默认的库路径
/usr/lib64
或/lib64
(最常用! 因为我们用的库大多是成熟库)。 - 在系统默认的库路径下建立软链接。
- 把库所在的路径添加到环境变量
LD_LIBRARY_PATH
中。 - 在
/etc/ld.so.conf.d/
目录下创建配置文件, 然后执行ldconfig
命令更新配置。
黑客/网络安全学习包
资料目录
-
成长路线图&学习规划
-
配套视频教程
-
SRC&黑客文籍
-
护网行动资料
-
黑客必读书单
-
面试题合集
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
3.SRC&黑客文籍
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!
4.护网行动资料
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
5.黑客必读书单
**
**
6.面试题合集
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
更多内容为防止和谐,可以扫描获取~
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************