文件系统概览
文件系统: 如下图所示, 目录文件和普通文件等文件都存放在块中, 存放了目录文件的块为目录块, 目录文件中存放的信息是目录项. 目录项中包含存储该文件信息的i节点的指针和文件名, 查找文件是通过查看对应目录的目录项, 找到i节点编号, 由编号找到存储了文件信息的i节点, i结点中有指向数据块(即普通文件的存储位置)的指针, i节点中还有文件链接数, 即包含了这个i节点的编号信息的目录个数,
删除文件的条件: 只有当i节点中的链接个数等于0时才能删除该文件, 并且如果有进程打开了该文件, 该文件也不会立即删除, 即使文件链接数为0
文件被删除的过程: 当关闭一个文件时, 进程先去检查打开该文件的进程个数, 如果计数为0, 就接着去检查i节点的链接个数, 如果计数也是0, 那么就会删除该文件
测试过程
测试代码:
int main(void){
int fd;
if((fd = open("read.txt",O_RDWR | O_APPEND | O_CREAT,0600)) == -1){
fprintf(stderr,"open failed: %s\n",strerror(errno));
exit(1);
}
if(unlink("read.txt") == -1){
fprintf(stderr,"unlink failed: %s\n",strerror(errno));
exit(1);
}
fprintf(stdout,"unlink ok, about to sleep for 20 sec\n\
1.use ll to check whether the file can be found or not\n\
2.use df to check the disk and see if the file was already deleted.\n");
sleep(20);
fprintf(stdout,"process exit\n\
use df to check the disk and see if the file was already deleted.\n");
exit(0);
}
测试结果:
结果分析
- 程序执行前, 用
ll
命令查看到 read.txt 文件大小为5000字节, 用df
命令查看到用户磁盘空间中使用了17680224个block - 程序执行中(程序退出之前), 用
ll
命令搜索 read.txt 文件, 发现已经查找不到, 说明对应的目录项已经被删除, 此时该文件的链接计数已经为0. 再用’df’命令查看用户磁盘空间, 发现使用的空间仍然没变, 说明文件并没有被删除, 因为此进程打开了该文件 - 程序退出后, 用’df’命令查看磁盘空间, 发现使用的空间减少了8个单位, 说明程序退出后才将此文件删除了. 因为该文件链接计数为0且没有进程打开该文件, 所以文件被关闭时就被内核被删除了