【Chapter4*重点总结*】文件删除以及du和df的区别

本文探讨了在Unix系统中使用unlink函数删除文件时,磁盘空间的释放机制。通过一个具体的C语言程序示例,解释了为什么在文件被删除后,磁盘空间可能不会立即更新,以及du和df命令在查看磁盘空间时的区别。

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

一、unlink文件

看下面的删除文件代码,如果在执行前、执行中(睡眠的15秒)、执行后分别查看磁盘空间大小,会有什么不同呢?

//删除一个文件,并且在15秒后关闭程序
  #include"apue.h"
 #include"fcntl.h"
  
 int main(int argc,char* argv[])
 {
    int fd;
    if(argc<2){
         err_sys("请输入要删除的文件名!感谢哈~");                          
     }
 
     if((fd=open(argv[1],O_RDONLY))==-1){
       err_sys("打开文件失败!\n");
     }
     printf("已打开该文件\n");
 
    if(unlink(argv[1])==-1){
         err_sys("删除文件失败,宝宝也不知道哪里错了哦~");
     }
     printf("删除文件成功\n");
     sleep(15);
     printf("停止睡眠,现在可以做其他事情了哦~\n"); 
     exit(0);
 }

执行前查看磁盘空间大小:可用空间是2.9G

fairy@ubuntu:~/Unix_Code/Chapter4$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G   15G  2.9G  84% /

执行中查看磁盘空间大小:仍为2.9G

fairy@ubuntu:~/Unix_Code/Chapter4$ ./4-8 1.mp4
已打开该文件
删除文件成功
fairy@ubuntu:~/Unix_Code/Chapter4$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G   15G  2.9G  84% /

执行结束后再查看磁盘空间大小,为3.2G

fairy@ubuntu:~/Unix_Code/Chapter4$ ./4-8 1.mp4
已打开该文件
删除文件成功
停止睡眠,现在可以做其他事情了哦~
fairy@ubuntu:~/Unix_Code/Chapter4$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G   15G  3.2G  82% /

明明程序已经删除了文件,在睡眠的15秒钟,在查看磁盘大小时,为什么没有释放呢?这就取决于删除文件的两个注意:

1.文件硬链接数为0,目录项删除
2.如果有进程打开文件时,i节点不会被删除。直到文件被关闭同时链接数为0,才会删除i节点

程序中满足链接数为0(unlink),但由于之前已经open了这个文件,没有释放,造成了句柄泄露。直到程序结束时,才释放文件描述符。这时满足第二个条件才会删除i节点,释放空间。假如程序中close(fd),这时会立刻删除文件。

二、du和df命令区别

检查磁盘空间大小,有两个命令可选择,du查看文件占用磁盘块大小,df查看文件系统可用空间。

fairy@ubuntu:~/Unix_Code/Chapter4$ du 4-8.c
4	4-8.c
fairy@ubuntu:~/Unix_Code/Chapter4$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G   15G  3.2G  82% /

但在删除文件时,du和df命令会有差别。

du(disk usge)逐级进入指定目录的子目录,统计子目录的文件占用数据块大小,可理解为用户级程序。

df(disk free)是检查文件系统的磁盘占用情况。文件系统会在磁盘上存放自身的数据,例如超级快、自举块、i节点图等,这些成为Meta Data。检查时利用i节点的查询获取磁盘可用大小,考虑Meta Data,而du是不考虑Meta Data的。
参考:http://yanue.net/post-89.html

三、思考

对于删除文件的程序,使用的是df命令,如果使用du呢,会出现什么情况?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值