版权声明:欢迎提问:[email protected] https://blog.csdn.net/include_heqile/article/details/83182303
程序源代码:
#include <sys/stat.h>
#include <sys/fcntl.h>
/***自编头文件
ourhdr.h: http://blog.sina.com.cn/s/blog_8312d78f01014uu8.html
my_err.h: https://blog.csdn.net/cuiyifang/article/details/8288649
***/
#include "ourhdr.h"
#include "my_err.h"
int main(void)
{
if(open("tempfile", O_RDWR) < 0)
err_sys("open error");
if(unlink("tempfile") < 0)
err_sys("unlink error");
printf("file unlinked\n");
sleep(15);
printf("done\n");
exit(0);
}
我们先使用dd
命令将文件tempfile
的大小填充为9MB
touch tempfile
dd if=/dev/zero of=/home/database/unix高级环境编程/tempfile bs=1M count=9
查看tempfile
文件大小:
[hql@localhost unix高级环境编程]$ ls -lh tempfile
-rw-rw-r--. 1 hql hql 9.0M Oct 19 07:32 tempfile
查看工作目录的使用情况:
[hql@localhost unix高级环境编程]$ df /home/database/unix高级环境编程/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 36805060 6627580 30177480 19% /
在后台运行a.out
(由上面的源文件编译):
[hql@localhost unix高级环境编程]$ ./a.out &
[1] 24931
然后立刻查看文件是否仍然存在,并查看工作目录使用率:
ls -lh tempfile; df /home/database/unix高级环境编程/
ls: cannot access tempfile: No such file or directory
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 36805060 6627620 30177440 19% /
从上面的运行结果我们可以看到,虽然文件已经找不到了,但是它任然是存在的,因为工作目录的利用率没有降低(也就是说tempfile
仍然在占用空间)
这是因为程序尚未运行完成(我们让它sleep
了15s
),tempfile
仍然处于打开状态,所以其内容并没有被删除,15s
过后,程序执行完毕,程序打开的所有文件都被关闭,tempfile
文件的内容也就被删除了
[hql@localhost unix高级环境编程]$ done
[1]+ Done ./a.out
[hql@localhost unix高级环境编程]$ df /home/database/unix高级环境编程/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 36805060 6618352 30186708 18% /
工作目录的利用率由19%
降到了18%
,说明tempfile
占用的空间已经被释放了
unlink
函数的这种特性经常被程序用来确保即使是在程序崩溃时,它所创建的临时文件也不会遗留下来
进程用open
或creat
创建一个文件,然后立即调用unlink
,由于该文件仍旧是打开的,
所以不会将其内容删除,只有当进程关闭该文件或终止时(在这种情况下,内核关闭该进程所打开的全部文件),该文件的内容才被删除