既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
//Open 函数中,有一些参数:
//O_CREAT 表示当文件不存在,创建一个新文件;
//O_RDWR 表示以读写方式打开;
//O_TRUNC 表示打开文件后,将文件的长度截断为 0。
if((fd=open(“./test”, O_RDWR|O_CREAT|O_TRUNC))==-1)
{
printf(“Open Error\n”);
exit(1);
}
ret = write(fd, &buffer, sizeof(int)); // buffer 写入数据的位置 第上参数希望写入的字节数
if( ret < 0) //write返回值是写入到文件的字节数
{
printf(“write Error\n”);
exit(1);
}
printf(“write %d byte(s)\n”,ret);
lseek(fd, 0L, SEEK_SET); // 重新定位读写的位置
// 第二个参数是重新定位的位置,第三个参数是 SEEK_SET,表示起始位置为文件头 俩个结合设置为从头开始的位置
ret= read(fd, &num, sizeof(int)); // read 用于读取数据 参数同write
if(ret==-1)
{
printf(“read Error\n”);
exit(1);
}
printf(“read %d byte(s),the number is %d\n”, ret, num);
close(fd); // 关闭文件
return 0;
}
//这三个函数可以返回与打开文件描述符相关的文件状态信息 , 然后写到 struct stat buf中
int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
//stat/lstat 通过文件名获取文件信息,stat没有软连接的能力; fstat 通过 fd 获取文件信息
//系统调用列出一个文件夹下面的文件以及文件的属性
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
-
opendir 打开一个目录, 生成一个目录流 DIR
- readdir 读取目录流的一个条目, 自动指向下一个条目
- closedir 关闭目录流
int main(int argc, char *argv[])
{
struct stat sb;
DIR *dirp;
struct dirent *direntp;
char filename[128];
if ((dirp = opendir(“/root”)) == NULL) {
printf(“Open Directory Error%s\n”);
exit(1);
}
while ((direntp = readdir(dirp)) != NULL){
sprintf(filename, “/root/%s”, direntp->d_name);
if (lstat(filename, &sb) == -1)
{
printf(“lstat Error%s\n”);
exit(1);
}
printf(“name : %s, mode : %d, size : %d, user id : %d\n”, direntp->d_name, sb.st_mode, sb.st_size, sb.st_uid);
}
closedir(dirp);
return 0
}
* 在内核中,要有一整套的数据结构来表示打开的文件。
* 在用户态,每个打开的文件都有一个文件描述符,可以通过各种文件相关的系统调用,操作这个文件描述符。

## 磁盘文件系统
* 磁盘→盘片→磁道→扇区(每个 扇区512 字节)
* ext\* 定义文件系统的格式
### inode 与数据块
- 硬盘分为一个个大小相同的单元→块 ( block ), 大小 4K, 扇区的整数倍, 大小在格式化时可配置
- 因此, 存放文件时不用分配连续的空间。
- 也因此要为文件建立块索引 + 元数据(名字, 权限, 所属) 信息, 存放于 inode 中
- inode 还维护三个时间: i_atime 访问时间; i_ctime 最近访问的时间 inode 时间; i_mtime 更改文件时间

- 文件分为多个块, 每个块的位置存放在 inode 的 i_block 中, 共 15 项
- ext2 和 ext3 中, 前 12 项保存块的位置, 若文件较大, 则第十三项指向间接块, 间接块存放剩余数据块的位置; 文件再大, 第 14项 i_block[13]指向两级间接块, 第十五项 i_block[14] 会指向三次间接块
- 但上述, 大文件需要访问多个块才能读取到数据
- ext4 引入 Extents 概念, 可以用于存放连续的数据块

- Extents 是树形结构, 每个节点由一个头 ext4_extend_header 来描述节点
- 节点有多个项 (12byte), 对于叶子节点: 每项直接指向硬盘上的连续块的地址,称为数据节点; 分支节点: 每项指向下一层节点,称为索引节点
- 文件不大: inode 可放下一个头 + 4 个数据项, eh_depth = 0 表示数据节点。
- 文件较大: 除了根节点(存于 inode.i_block 中) , 其他节点都存于一个块中, 4K 能存 340 项, 每项可放 128MB, 总 42.5GB=
### inode 位图与块位图
- 要保存数据是, 应放在哪? 全扫一遍效率低

- 用一个块保存 inode 位图, 每一位对应一个 inode, 1→被占用; 同样用一个块保存块位图
- open 再空文件夹下创建文件: do\_sys\_open→…→lookup\_open 再调用 dir\_node→i\_op\_create(ext4\_create) 创建文件夹 inode
- 调用 ext4\_create→…→\_\_ext4\_new\_inode 读取 inode 位图, 找到下一个空闲 inode
- 同样用块位图找空闲块
### 文件系统格式
* 一个位图只能表示 2^15 个数据块, 即 128MB
- 一个 inode 位图 + 一个 block 位图, 称为块组, 用数据结构 ext4\_group\_desc 表示, 里面包含 inode 位图, block 位图和 inode 列表
- 这些块组描述符构成列表, 另外用超级块 ext4\_super\_block 描述整个文件系统; 第一个块组前 1k 用于`启动引导`

- 文件系统由引导块 + N 个块组组成; 每个块组由: 超级块 + 块组描述符表 + 块位图 + inode 位图 + inode 列表 + 数据块构成
- 超级块和块组描述符表都是全局信息; 数据非常重要,需要进行备份。
- 若开启 `sparse_super`备份策略, 则只在固定块组中备份, 比较浪费空间 ,块组总数目是整个文件系统的大小 。
- 采用 `Meta Block Groups` 特性, 避免块组表浪费空间, 或限制文件系统的大小。


**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**