快乐Linux —— 8.1 文件系统 & 文件结构模型
参考:
https://blog.csdn.net/u013613341/article/details/51019075
《Unix环境高级编程》 《鸟哥的Linux私房菜—基础篇》
0. 简介
先看看Linux 下的文件系统和文件详细信息,再简单介绍下文件编程概念。
1. 文件系统
Linux 一般采用的都是Ext系列 (索引式文件管理系统)。
-
super block
记录文件系统的整体信息,包括 inode / block 总量,使用量,剩余量,大小等以及文件系统格式与相关信息。
-
block
放置文件数据的地方,一般一个block为4k 如上图中的数据块 记录文件的内容,当文件较大时占用多个block。
-
inode block
记录文件的属性信息,一个文件占用一个inode block,以及文件内容在哪些block 如上图的i节点
注意:
-
上图中的目录块就是目录占用的数据,在文件系统上,当创建一个目录,会分配一个inode 块,和一个block,其中inode除了存放目录属性等,还存放这个block 索引,而block 索引中存放的是该目录下每个文件的inode 号和文件名。
当对文件进行操作时,都是先通过目录的inode 索引到目录的block中找到该文件的inode 号,然后找到文件的block读取数据。在每一步要读取block 的数据前,都要检查当前进程是否具有inode 中指定的权限。
-
一个block 至多只能放一个文件。
-
每个文件都只会占用一个inode节点,所以文件系统能建立的文件总量取决于inode 总量。
-
在文件编程中的stat 结构体,大部分信息都是取自inode 节点,但像inode 号,和文件名是取自目录块。
-
当系统读取文件时要先找到文件的inode 节点,分析完inode 所记录的文件权限,若权限符合,才可以读取文件内容。
-
除了索引式文件系统,还有FAT文件系统等在这里看看它们读取一个文件的区别。
由上图也可以直观看出,为什么叫索引式,其中inode索引了所有该文件数据块的位置。而FAT更像通过链表的形式读取一个文件。
-
当一个文件太大时那么就要占用多个block,而一个inode 节点可能为 256 字节如果说一个inode节点中直接存放所有的block索引的话,那么就算忽略inode保存的文件信息,最多可以存放 256 / 4 * 4 K (第一个4 为一个block 占的字节数,第二个为一个block容量)也就是说,一个文件最大只能 256k,显然这是不合常理的。其实inode 保存block采用了多级索引的方式。
2. 文件结构模型
获取文件详细信息。
通过下面三个函数可以获得文件详细信息,这些信息存储在 stat 结构体里面。
#include <sys/stat.h>
int stat(const char *pathname, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
需要注意的是:
- 三个函数都通过
struct stat *
指针返回获取到的文件信息。 - fstat 是通过进程打开的文件描述符,而 stat 和 lstat 都是通过文件路径。
- lstat 与 stat ,当遇到符号链接时, lstat 返回的是符号链接的信息,而 stat 返回的是符号链接所链接的文件的信息。
- 返回值:若成功,返回 0,否则返回 -1。
stat 成员解析
-
mode_t st_mode
通过位信息,存储文件类型和权限文件类型 exp:
if(S_ISREG(st_mode)) cout<<"普通文件";
文件权限 exp:
if(st_mode & S_IRUSR) cout<<"有用户读权限";
-
ino_t st_ino
该文件的 inode 号 -
dev_t st_dev
/dev_t st_rdev
文件系统的普通设备和特殊设备的编号,不太常用 -
nlink_t st_nlink
文件的硬链接数 -
uid_t st_uid
/gid_t st_gid
文件所有者的uid 和 gid -
off_t st_size
以字节为单位的文件长度!!! 该项只对普通文件,目录文件和符号链接文件有意义。
-
time_t st_atime
/time_t st_mtime
/time_t st_ctime
文件数据的最后访问时间 / 文件数据的最后修改时间 / 文件 inode 最后修改时间 -
blksize_t st_blksize
文件系统给文件分配空间时的最小单位,所以也是最佳的I/O块大小 -
blkcnt_t st_blocks
文件所占的block 数