从测试unlink函数的功能出发直观了解如何才会删除一个文件

本文详细解释了文件系统中文件的存储结构,特别是目录项和i节点的作用,以及文件删除的条件和过程。通过测试代码展示了如何通过操作打开、关闭和删除文件来观察链接计数和磁盘空间变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件系统概览

文件系统: 如下图所示, 目录文件和普通文件等文件都存放在块中, 存放了目录文件的块为目录块, 目录文件中存放的信息是目录项. 目录项中包含存储该文件信息的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);
}

测试结果:
在这里插入图片描述

结果分析

  1. 程序执行前, 用ll命令查看到 read.txt 文件大小为5000字节, 用df命令查看到用户磁盘空间中使用了17680224个block
  2. 程序执行中(程序退出之前), 用ll命令搜索 read.txt 文件, 发现已经查找不到, 说明对应的目录项已经被删除, 此时该文件的链接计数已经为0. 再用’df’命令查看用户磁盘空间, 发现使用的空间仍然没变, 说明文件并没有被删除, 因为此进程打开了该文件
  3. 程序退出后, 用’df’命令查看磁盘空间, 发现使用的空间减少了8个单位, 说明程序退出后才将此文件删除了. 因为该文件链接计数为0且没有进程打开该文件, 所以文件被关闭时就被内核被删除了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值