Loading

快乐Linux —— 8.1 文件系统 & 文件结构模型

参考:

https://blog.csdn.net/u013613341/article/details/51019075

《Unix环境高级编程》 《鸟哥的Linux私房菜—基础篇》

0. 简介

先看看Linux 下的文件系统和文件详细信息,再简单介绍下文件编程概念。

1. 文件系统

Linux 一般采用的都是Ext系列 (索引式文件管理系统)。

  1. super block

    记录文件系统的整体信息,包括 inode / block 总量,使用量,剩余量,大小等以及文件系统格式与相关信息。

  2. block

    放置文件数据的地方,一般一个block为4k 如上图中的数据块 记录文件的内容,当文件较大时占用多个block。

  3. 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 是通过进程打开的文件描述符,而 statlstat 都是通过文件路径。
  • lstatstat ,当遇到符号链接时, lstat 返回的是符号链接的信息,而 stat 返回的是符号链接所链接的文件的信息。
  • 返回值:若成功,返回 0,否则返回 -1。
stat 成员解析
  1. mode_t st_mode 通过位信息,存储文件类型和权限

    image-20200119095719612

    文件类型 exp: if(S_ISREG(st_mode)) cout<<"普通文件";

    文件权限 exp: if(st_mode & S_IRUSR) cout<<"有用户读权限";

  2. ino_t st_ino 该文件的 inode 号

  3. dev_t st_dev / dev_t st_rdev 文件系统的普通设备和特殊设备的编号,不太常用

  4. nlink_t st_nlink 文件的硬链接数

  5. uid_t st_uid / gid_t st_gid 文件所有者的uid 和 gid

  6. off_t st_size 以字节为单位的文件长度

    !!! 该项只对普通文件,目录文件和符号链接文件有意义。

  7. time_t st_atime / time_t st_mtime / time_t st_ctime 文件数据的最后访问时间 / 文件数据的最后修改时间 / 文件 inode 最后修改时间

  8. blksize_t st_blksize 文件系统给文件分配空间时的最小单位,所以也是最佳的I/O块大小

  9. blkcnt_t st_blocks 文件所占的block 数

posted @ 2019-11-25 19:31  沉云  阅读(233)  评论(0编辑  收藏  举报