文件系统与inode

文件系统

FILE

  • 因为IO相关的函数都与系统调用接口对应,并且库函数封装系统调用,所以访问文件实质上都是通过fd访问的。
  • 所以C库函数中的FILE结构体内部必定封装的fd。

缓冲方式分三种:

  1. 无缓冲
  2. 全缓冲
  3. 行缓冲
#include <stdio.h>
#include <string.h>

int main()
{
   const char *msg0="hello printf\n";
   const char *msg1="hello fwrite\n";
   const char *msg2="hello write\n";
   
   printf("%s",msg0);
   fwrite(msg1,strlen(msg0),1,stdout);
   write(1,msg2,strlen(msg2));
   
   fork();
   
   return 0;
}

运行结果:

hello printf
hello fwrite
hello write

如果对结果进行输出重定向 ./hello > file

运行结果:

hello printf
hello fwrite
hello write
hello printf
hello fwrite
  • 一般库函数写入文件都是全缓冲的(硬盘),而写入显示器的是行缓冲。
  • printf,fwrite库函数会自带缓冲区,当发生重定向到普通文件,数据的缓冲方式由行缓冲变成了全缓冲。
  • 而我们放在缓冲区的数据就不会立即刷新,甚至fork之后
  • 但进程退出后,会统一刷新,写入文件当中。
  • 但是fork的时候父子数据会发生写时拷贝,所以当父进程准备刷新的时候,子进程也有了同样的一份数据,随即产生两份数据。
  • write没有变化说明me有发生缓冲。

printf,fwrite库函数自带缓冲区,而write系统调用没有带缓冲区。这里提到的缓冲区都是用户级缓冲区。

printf,fwrite是库函数,write是系统调用,库函数在系统调用的“上层”,是对系统调用的封装,但write没有缓冲区,而printf,fwrite有,说明这个缓冲区是二次加上的,且由C标准库提供。

文件系统

用ls -l命令查看文件数据。

文件系统与inode

用stat查看文件数据

文件系统与inode

Inode

保存文件属性,一个文件对应一个inode,为了标识inode,每个文件只有一个inode号。

文件系统与inode

Block Group:文件系统根据分区大小划分N个Block Group,每个Block Group的结构组成都相同。

超级块:存放文件系统本身的结构信息。主要记录的信息有inode的总量和bolck,未被使用的inode数量和bolck,一个bolck的大小和inode的大小,最近一次挂载的时间,租金一次写入数据的时间,最近一次检验磁盘的时间等等,与文件系统相关的信息。如果超级块被破坏,那么文件系统就被破坏

块组描述符:描述块组属性信息

块位图:块位图中记录着数据块中哪个数据块已经被占用,哪个还未被占用。

inode位图:每个bit位表示inode是否空闲可用。

i节点表:存放文件属性 比如,大小,所有者,修改时间等

数据区:存放文件内容

查文件的顺序: 从inode号到inode再到数据块再到数据

在Linux下操作任何一个文件都是在特定目录下操作的,目录也是文件,目录内容保存的是当前文件名和inode的映射关系。

硬链接

与文件共享inode,就是文件名和inode的映射关系。

如果同一个两个文件链接状态相同,即硬接数数相同,那么这个硬链接的硬链接数为2,

我们在删除文件时干了两件事:1.在目录中将对应的记录删除。2.将硬链接数减一,如果结果为0,则将对应的磁盘释放。

软链接

是另外的独立文件,帮助访问文件。

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件

Access:最后访问时间

Modify:文件内容最后修改时间

Change:属性最后修改时间