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

一、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呢,会出现什么情况?

猜你喜欢

转载自blog.csdn.net/vainfanfan/article/details/83895257