文件系统
FILE
- 因为IO相关的函数都与系统调用接口对应,并且库函数封装系统调用,所以访问文件实质上都是通过fd访问的。
- 所以C库函数中的FILE结构体内部必定封装的fd。
缓冲方式分三种:
- 无缓冲
- 全缓冲
- 行缓冲
#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命令查看文件数据。
用stat查看文件数据
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:属性最后修改时间