LINUX 怎么删除 文件link

LINUX 怎么删除 文件link,第1张

每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。
当通过shell的touch命令或者在程序中open一个带有O_CREAT的不存在的文件时,文件的链接数为1。

通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,即open之后返回fd,调用进程可以通过fd来read 、write 、 ftruncate等等一系列对文件的 *** 作。
close()就是消除这种调用进程与文件之间的访问关系。自然,不会影响文件的链接数。在调用close时,内核会检查打开该文件的进程数,如果此数为0,进一步检查文件的链接数,如果这个数也为0,那么就删除文件内容

link函数创建一个新目录项,并且增加一个链接数。
unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在unlilnk之前没有close,那么依旧可以访问文件内容。

综上所诉,真正影响链接数的 *** 作是link、unlink以及open的创建。
删除文件内容的真正含义是文件的链接数为0,而这个 *** 作的本质完成者是unlink。close能够实施删除文件内容的 *** 作,必定是因为在close之前有一个unlink *** 作。

举个例子简单说明:通过shell touch testtxt
1、stat("testtxt",&buf);
printf("1link=%d\n",bufst_nlink);//未打开文件之前测试链接数

2、fd=open("testtxt",O_RDONLY);//打开已存在文件testtxt
stat("testtxt",&buf);
printf("2link=%d\n",bufst_nlink);//测试链接数

3、close(fd);//关闭文件testtxt
stat("testtxt",&buf);
printf("3link=%d\n",bufst_nlink);//测试链接数

4、link("testtxt","test2txt");//创建硬链接test2txt
stat("testtxt",&buf);
printf("4link=%d\n",bufst_nlink);//测试链接数

5、unlink("test2txt");//删除test2txt
stat("testtxt",&buf);
printf("5link=%d\n",bufst_nlink);//测试链接数

6、重复步骤2 //重新打开testtxt

7、unlink("testtxt");//删除testtxt
fstat(fd,&buf);
printf("7link=%d\n",bufst_nlink);//测试链接数

8、close(fd);//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。

顺次执行以上8个步骤,结果如下:
1link=1
2link=1 //open不影响链接数
3link=1 //close不影响链接数
4link=2 //link之后链接数加1
5link=1 //unlink后链接数减1
2link=1 //重新打开 链接数不变
7link=0 //unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过 文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。
执行步骤8,文件内容被删除。。。。

#建立软链接
mv /data/ftp /data2/
ln -s /data2/ftp /data/ftp
#删除软连接
#当删除链接文件时,如果不小心会把原始文件删掉
rm /data/ftp
#只是少了一个“ / ” 删除的 就是链接文件, 也就是在文件的最后不要加上"/"
结论:
在删除文件时要小心
在删除软链接文件时,小心使用 Tab 建,一定不要在目录后面加斜扛"/"

你输入的一定是“rm -fr jakarta/”
所以才提示你“rm: cannot remove `jakarta/': Not a directory”
换用“rm -fr jakarta”就应该没问题了


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13400827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存