Linux
未读动静态库 —— 动态库 1. 库的制作者 如何制作动态库 1. 编写库的源代码和头文件 创建头文件:声明库的对外接口函数。 创建源文件:实现头文件中声明的函数。 2. 编译为位置无关目标文件 -fPIC 关键作用:生成位置无关代码(Position Independent Code),使代码可被加载到内存任意位置,这是动态库的核心要求。 3. 链接生成动态库文件 -shared 参数:指示链接器生成共享库(.so 文件)。 4. 组织发布文件 将以下文件提供给使用者: 1234├── include/ # 头文件目录│ └── mathlib.h # 接口声明└── lib/ # 库文件目录 └── libmathlib.so # 动态库二进制 2. 动态库 demo 1. mathlib.h(头文件)—— 对外接口声明 12345678//相当于 #pragma once , 用于防止重复包含头文件#ifndef MATHLIB_H#define MATHLIB_Hint add(int a, int ...
4630436162ade97ba2718b7d0c4b3b6345cfbadc0d32b89a1bd3fd7ce10543c112980c579714dbaddada922bb1c5210d84f7f04fda52e137b1cb9270e49d94cbcb6f7b4f2a8382b1e2f940e5ef3b6277756321af41592d0f85e2f3290fe6ea07ba1464b00c849dad4933b82ce09a6614623baaf0923503c5e40bc0bef581ae2c47c628d46ad390d59062dd32a0425ceceb5f83cf472456ea8829584f745a049799478e3af5f9c05694a9ca05cce60716763be78540d366773135d245065c1109a82cac8d68a67445f18390970f15ebbaddc5347a1cc2e528a32ab9afe51fef63551e0e7308e5390d3336b8f68b628bd511d6b750761a280ff ...
Linux
未读动静态库 —— 静态库 稀土掘金 | 动静态库的认识 CSDN | 理解文件系统|文件缓冲区|软硬链接|动静态库 CSDN | 相关好文 CSDN | 相关好文 1. 扩展概要(了解) 一个文件被打开操作系统要做什么:打开文件的流程 = 找 inode ➜ 创建 file 结构 ➜ 建立缓冲 ➜ 用页表映射读写 ➜ 后续 read/write 就操作 page 缓冲。 1. 为什么说“4KB Page”是核心单位? 现代操作系统使用 分页机制(Paging) 管理内存,每一页(Page)是 一块固定大小的内存单元。Linux 默认: 一页大小为 4KB。 物理内存也以页框为单位分配(如 Frame #0,Frame #1…)。 所有虚拟内存地址映射到物理内存页框时,以 4KB 为基本单位。 地址空间 页面大小 含义 虚拟地址空间 4KB/page 每个进程有自己的虚拟地址空间 物理内存 4KB/frame 物理内存被划分为一个个页框 页面表(Page Table) 将虚拟页映射到物理页框 所以:所有读写、分配、预加载、换页,都是以“页”为单位 ...
Linux
未读inode 与软硬链接 先说明一下前面没有解释的东西:文件权限后面的 1 是什么? 1. 软链接(Symbolic Link / Symlink) 1. 概念 软链接是一个特殊类型的文件,它的内容是一个 路径字符串,指向原始文件的路径。 就像 Windows 的 快捷方式; 保存的是目标路径; 用途:可以在任何地方“引用”一个程序、配置文件、目录; 常用于: 给程序创建入口路径(比如 /usr/bin/python 链接到 /usr/bin/python3.11); 让你在任意位置执行程序; 多个配置环境之间切换。 特性 描述 inode 不一致 链接文件有自己的 inode,数据内容是“路径名” 可跨分区 因为只是保存路径字符串,不依赖 inode 可对目录使用 如 /usr/bin/python 链接到 /usr/bin/python3.11 不影响原文件 原文件不变,软链接只是一个指向的“引用” 2. 相关命令 12ln -s 源文件或目录 软链接文件名ln -s /真实路径/程序 /usr/local/bin/程序名 12ln -s ...
Linux
未读理解文件系统 1. 认识磁盘磁带 由于磁盘磁带和操作系统组成原理更相关,而且相关概念用语言太抽象,所以我找到了一些比较好的视频和书籍内容来帮助理解(注意视频、书籍内容有部分知识我们不涉及,所以不懂也没关系,多出的就当是眼界扩展了): 硬盘驱动器是如何工作的?(You Tube) 硬盘的工作原理(B 站) 机械硬盘是如何工作的?(B 站) → 机械磁盘:结构与工作原理详解 → 磁带为何能记录声音?(主要了解其存储原理) 相关文章 | 博客园 相关文章 | CSDN 相关文章 | CSDN 摘自《操作系统概念精要 原书第 2 版》298 页前后(真的是很想将内容直接摘过来,奈何实在是没找到电子版,只能扫描现书将就看吧 😂)。这里的图片已经排好序,直接按照顺序看即可。推荐直接去看原书,也希望有电子版的进行贡献一下,感谢您的开源精神! 自然也少不了鸟哥啦~ 摘自《鸟哥的 Linux 私房菜 基础学习篇(第四版)》210~217 页相关内容。还是推荐看原书,就不过多赘述了。 首先说明一下磁盘的物理组成,整颗磁盘的组成主要有: 圆形的盘片(主要记录数据的部分); 机械 ...
Linux
未读缓冲区 相关文章 | CSDN 1. 为什么需要缓冲区?(核心原因) 先出结论:格式化 ➔ 拼接成大数据块 ➔ 缓冲 ➔ 统一输出 ➔ 保证数据连贯,减少系统调用,提高效率! 1. 提高 I/O 效率! 硬件设备(尤其是磁盘、网络、终端)操作 很慢很慢,每次读写都直接操作设备 ➔ 太耗时 ➔ 系统负担重。 所以: 少量多次 ➔ 聚集成大量一次。 把「很多小的写操作」放到内存中,攒到一定量再「统一批量」写入磁盘/屏幕。 减少系统调用(syscall)次数 ➔ 提高整体程序运行效率。 简单比喻:你买菜如果每买一根葱就跑一次超市,累不累?当然要一次性买一堆,装个购物袋带回来!(这就是缓冲思想) 2. 配合格式化 printf("名字:%s, 年龄:%d\n", name, age); 这种格式化输出,本质上做了两件事: 格式化处理(Format) %s、%d 等占位符 ➔ 根据数据类型,把 name 和 age 这两个变量 格式化成字符串。 例如:把整数 23 转成 "23",字符串 "Tom" 保持原样。 统一输出 ...
Linux
未读重定向 相关好文 | CSDN 1. 什么是重定向? 重定向本质上就是操作文件描述符(每一个打开的文件或设备在内核中都有一个编号,称为文件描述符),即 修改标准输入/输出/错误 这三个文件描述符(file descriptor,简称 FD)的指向,让它们 不再指向默认终端(屏幕、键盘),而是指向 文件、设备或者其他地方。 文件描述符编号 描述 默认指向 0 标准输入 stdin 键盘 1 标准输出 stdout 屏幕 2 标准错误 stderr 屏幕 比如常见的 shell 命令: 1ls > output.txt 背后的本质动作是: 关闭文件描述符 1(stdout) 打开或创建 output.txt 将描述符 1 指向 output.txt 文件 这样,所有本应该显示在屏幕上的内容,都会写入 output.txt 文件。 2. 常见的重定向符号 符号 含义 功能描述 示例 效果 > 输出重定向(覆盖),stdout 把标准输出写入到指定文件,若文件存在则 清空 后写入,否则创建 ls > out.txt 将 l ...
Linux
未读基础 IO —— C 语言文件 I/O 操作基础 前言 1. 文件的基本概念 文件的定义: 文件 = 内容(数据) + 属性(如权限、修改时间、所有者等)。 属性是文件管理的重要依据,贯穿文件的存储、访问和控制全流程。 2. 文件的两种状态 打开的文件 触发条件:由进程主动打开(如读写操作)。 存储位置:加载到内存中。 核心机制: 进程关联:每个打开的文件需与进程绑定,形成“进程-文件”的 多对一关系(1: n 关系:一个进程可打开多个文件)。 内核管理:操作系统为每个打开的文件创建 文件打开对象(如 struct XXX),记录文件属性、状态及链表指针(如 next),便于统一管理。 未打开的文件 存储位置:磁盘上。 核心问题:如何高效组织海量未打开文件,支持 快速增删查改。 管理目标:通过目录结构、文件系统层级等实现文件分类与定位。 3. 操作系统如何管理打开的文件 管理原则 —— 先描述,后组织: 描述:为每个打开的文件创建内核对象(如 struct file),记录文件属性(如读写位置、权限)和操作接口。 组织:通过链表、哈希表等数据结构管 ...
Linux
未读fork + exec 系列函数创建子进程并执行其他程序(跨语言衔接示例) CSDN 相关文章 fork(2) - Linux 手册页 exec(3) - Linux 手册页 在 Linux 系统编程中,fork() 和 exec() 是进程控制的两大核心。本文将演示如何使用 fork 创建子进程,再使用 exec 执行外部程序,展示多语言之间的 协同执行 过程。 1. fork + exec 基础原理 fork():复制当前进程,返回两次(一次给父进程,一次给子进程) exec*():用新程序 替换当前进程映像(进程 ID 不变) 通常模式: 12345678910pid_t pid = fork();if (pid == 0) // 子进程执行新程序{ execl("/bin/ls", "ls", "-l", NULL); perror("execl"); // 出错 ...
Linux
未读从零到一实现一个简易 Shell 这应该是个蛮有趣的话题:“什么是 Shell”?相信只要摸过计算机,对于操作系统(不论是 Linux、Unix 或者是 Windows)有点概念的朋友们大多听过这个名词,因为只要有“操作系统“那么就离不开 Shell 这个东西。不过,在讨论 Shell 之前,我们先来了解一下计算机的运行状况吧!举个例子来说:当你要计算机传输出来“音乐”的时候,你的计算机需要什么东西呢? 硬件:当然就是需要你的硬件有“声卡芯片”这个配备,否则怎么会有声音; 核心管理:操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱动程序啰; 应用程序:需要使用者(就是你)输入发生声音的指令啰! 这就是基本的一个输出声音所需要的步骤!也就是说,你必须要“输入”一个指令之后,“硬件“才会通过你下达的指令来工作!那么硬件如何知道你下达的指令呢?那就是 kernel(核心)的控制工作了!也就是说,我们必须要通过“Shell”将我们输入的指令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作!基本上,我们可以通过下面这张图来说明一下: 以上内容摘自《鸟哥的 ...











