一、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呢,会出现什么情况?
扫描二维码关注公众号,回复:
3999546 查看本文章