操作系统实践——知识点与小demo总结(简单文件系统的实现)

实验5:简单文件系统的实现 基础架构与持久化层 宏定义 1 2 3 4 5 6 7 8 9 10 11 #define IMAGE_FILE "fs.img" // 磁盘镜像文件名 #define BLOCK_SIZE 512 // 每个数据块字节数(512字节,传统磁盘扇区大小) #define DATA_BLOCKS 1024 // 数据块数量(1024个数据块,数据区512KB) #define MAX_FILES 256 // 文件/目录数上限(DirEntry数组大小) #define MAX_OPEN_FILES 32 // 同时打开文件数上限(OFT表大小) #define MAX_NAME_LEN 28 // 文件名长度上限 #define FAT_FREE (-1) // FAT表空闲块标记 #define FAT_END (-2) // FAT表链尾标记 #define FS_MAGIC 0x4D465331u /* "MFS1" */ FS_MAGIC 用于识别文件系统格式,加载时校验合法性,防止用其他文件创建的文件误当作文件系统镜像。 ...

April 7, 2026 · ClarkFlyBee

操作系统实践——知识点与小demo总结(Linux 进程管理)

ℹ️ 写在前面 本文尚未完成,但近期不会补充完整。 这里记录一下还需要写的部分: 实验代码与解析 实验3:Linux 进程管理 基本原理与知识点 读端与写端的区分 piep() 系统调用中: fd[0] 是读端 fd[1] 是写端 close() 怎么理解 通俗易懂的说,我们可以把文件描述符理解为电话号码。 1 2 pipe(fd) // 创建管道;相当于申请了一对专线电话, // 其中一条只能听(fd[0]),一条只能说(fd[1]) 假设pipe(fd) 后,fd[0]=3,fd[1]=4。 子进程创建后,会复制父进程的整个”通讯录“,而不是新建管道。 也就是说在子进程中,依然是fd[0]=3,fd[1]=4。 让我们回到 close() ,可以这样理解,一个进程执行 close(fd[1]) ,意味着它删除了这条拿来说的电话线(fd[1] 是写端),此后它不能再往这个管道中写数据,只能读。 但值得注意的是,父进程 close(fd[1]) 后,子进程不受影响,子进程依然可以写数据。 一句话总结:每个进程有自己的 fd,但指向同一个管道。close() 只是减少该管道在这个进程中的引用。 read() 函数返回什么? read() 的典型用法如下所示: 1 ssize_t n = read(fd, buf, count); 返回值 含义 场景 > 0 实际读取的字节数 正常情况,可能小于 count(短读) 0 EOF(文件结束) 所有写端都已关闭 -1 出错 被信号中断、非阻塞无数据等 创建管道时,读写两端自动打开,无需 open() 文件描述符(fd)是啥? 文件描述符是进程级别的”文件句柄“,是一个非负整数(0,1,2,3,…)。 可以这样理解,一个进程中有一张表格,列举了进程打开的I/O资源(文件、管道、设备等),这个文件描述符可以理解为这个表格的整数索引。 进程通过编号(文件描述符号),可以让内核操作资源,无需知道文件在内核中的复杂结构。 fd 是进程私有的,比方说有两个进程,进程 A 的 fd=3 可能指向管道;进程 B 的 fd=3 可能指向完全不同的文件。 ...

March 20, 2026 · ClarkFlyBee