文件系统的三个区域分别为:(1)超级块(2)i-节点表(3)数据区
超级块存放文件系统本身的结构信息。i-节点表存放文件本身的属性(*i-节点在文件系统中的位置是固定的,序号从0开始)。
数据区存放文件的内容。
创建文件的过程:
(1)、内核先找到一个空的i节点。将文件属性存储在i节点中
(2)、将文件的内容存在数据块中。
(3)、将文件内容在数据块中的序号按文件内容的先后顺序存放在i-节点的磁盘分布区。
(4)、内核将文件入口(i-节点序号,文件名字)添加到目录文件。文件名和i-节点号之间的对应关系将文件名和文件的内容及属性连接去来。
目录是抽象模型是一个包含i-节点号和文件名的表。
从目录文件找到数据的步骤:(跟创建文件的顺序相反)
(1)根据文件名在目录中找到文件i节点序号
(2)根据i-节点的序号定位i-节点的位置,并且读取i-节点的内容。
(3)通过i-节点中存储的文件内容所在数据块位置的信息,在数据块中查找文件的内容(调用read函数)
这也是对目录的操作第一个总是调用open函数的原因。
当文件太大时候,采用间接存储的方法,将i-节点的分配链表存储不下的内容存在数据块中, 这种块被称为间接块。
硬链接是指向数据块的,因此i-节点号相同,符号链接是指向原本指向数据块的i节点对应的文件名,因此删除源文件,只是断开一个i-节点和数据块的链接,硬链接还可以查看文件内容,而如果删除符号链接所链接的文件,符号链接不能通过i-节点找到文件内容所在块,所有符号链接会失效。
硬链接不能跨越文件系统,符号链接可以。
设备文件:
设备文件是链接,设备文件的i-节点存储的是指向内核子程序的指针,而不是文件大小和存储列表,内核中传输设备数据的子程序被称为设备驱动程序。
磁盘文件与内核之间有缓冲,设备文件与磁盘之间没有缓冲。
缓冲:
#include<fcntl.h>
int s;
s = fcntl(fd,F_GETFL);
s |= O_SYNC;
result = fcntl(fd,F_SETFL,s);
if(result == 1)
perror("setting SYNC");
位逻辑或操作打开位哦O_SYNC,该位告诉内核,对write的调用仅能在数据写入实际的硬件时才能返回,而不是在数据复制到内核缓冲时就执行默认 的返回操作。