unix下的unlink函数

版权声明:欢迎提问:[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仍然在占用空间)

这是因为程序尚未运行完成(我们让它sleep15s),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函数的这种特性经常被程序用来确保即使是在程序崩溃时,它所创建的临时文件也不会遗留下来

进程用opencreat创建一个文件,然后立即调用unlink,由于该文件仍旧是打开的,
所以不会将其内容删除,只有当进程关闭该文件或终止时(在这种情况下,内核关闭该进程所打开的全部文件),该文件的内容才被删除

猜你喜欢

转载自blog.csdn.net/include_heqile/article/details/83182303