int unlink(const char *pathname)
该函数用来删除pathname 指定的目录项,并将由pathname所引用的文件的链接数减一。但是文件的内容可能不会删除,如果此时有其他指向该文件的链接,则仍可通过其他链接访问文件。或是有进程打开了该文件,那么其内容也不会被删除
所以当关闭一个文件时,内核首先检查打开该文件的进程,如果该数为0,然后检查其链接数,如果该数也是0,那么就删除该文件内容。
我们运行一个程序时有时需要创建一些临时文件。如果进程运行过程中突然终止了,而临时文件还没来的及删除,那么就会遗留下很多没用的临时文件
unlink提供了解决这个问题的一种方法。创建一个临时文件后一刻调用unlink删除文件。但是进程还是打开该文件的,所以该临时文件内容依旧是能被访问的。但是进程
终止后,该文件内容就会被删除。
我们来做个测试
我们创建一个临时文件,然后调用unlink来删除该目录项。(我们在unink调用前后都睡眠5秒钟,好在中断用ls命令查看文件是否还存在)
6 int main(void){
7 int fd;
8 fd=open("temp",O_RDWR | O_CREAT |O_TRUNC,0666);
9 if(fd==-1){
10 perror("open error");
11 exit(1);
12 }
13
14 sleep(5);
15 unlink("temp");
16 printf("unlink\n");
17 sleep(5);
18
19 char buf[20];
20 if(write(fd,"aaaa",4)!=4){
21 perror("write error");
22 exit(1);
23 }
24 lseek(fd,0,SEEK_SET);
25 if(read(fd,buf,4)==-1){
26
27 perror("read error");
28 exit(1);
29 }
30 buf[4]='\0';
31 printf("read:%s\n",buf);
32
33 exit(0);
34 }
我们运行该程序:
feng@ubuntu:~/learn_linux_c_second/chapter_4$ ./a.out &
[1] 7557
feng@ubuntu:~/learn_linux_c_second/chapter_4$ ll temp
-rw-rw-r-- 1 feng feng 0 May 14 06:15 temp
feng@ubuntu:~/learn_linux_c_second/chapter_4$ unlink
ll temp
ls: cannot access temp: No such file or directory
feng@ubuntu:~/learn_linux_c_second/chapter_4$ read:aaaa
[1]+ Done ./a.out
feng@ubuntu:~/learn_linux_c_second/chapter_4$
后台运行该程序后,我们用 查看temp文件 发现被创建了。过几秒钟我们 再次用ll 命令查看该文件,显示已经没有该文件了
但是我们却还能向该文件写入数据,读出数据。这也验证了。unlink只是将文件的链接计数减一,至于文件内容删不删除则是情况而定(上面已经说明)
阅读(6068) | 评论(0) | 转发(0) |