
当通过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 test.txt
1、stat("test.txt",&buf)
printf("1.link=%d\n",buf.st_nlink)//未打开文件之前测试链接数
2、fd=open("test.txt",O_RDONLY)//打开已存在文件test.txt
stat("test.txt",&buf)
printf("2.link=%d\n",buf.st_nlink)//测试链接数
3、close(fd)//关闭文件test.txt
stat("test.txt",&buf)
printf("3.link=%d\n",buf.st_nlink)//测试链接数
4、link("test.txt","test2.txt")//创建硬链接test2.txt
stat("test.txt",&buf)
printf("4.link=%d\n",buf.st_nlink)//测试链接数
5、unlink("test2.txt")//删除test2.txt
stat("test.txt",&buf)
printf("5.link=%d\n",buf.st_nlink)//测试链接数
6、重复步骤2 //重新打开test.txt
7、unlink("test.txt")//删除test.txt
fstat(fd,&buf)
printf("7.link=%d\n",buf.st_nlink)//测试链接数
8、close(fd)//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。
顺次执行以上8个步骤,结果如下:
1.link=1
2.link=1//open不影响链接数
3.link=1//close不影响链接数
4.link=2//link之后链接数加1
5.link=1//unlink后链接数减1
2.link=1//重新打开 链接数不变
7.link=0//unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过 文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。
执行步骤8,文件内容被删除。。。。
删除link目录的方法是:创建一个软链接ln –s /var/www/test /var/test然后修改指向的新路径,基本上的增加、删除、修改就是这样的。
三点要注意:
1、ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化。
2、ln的链接又软链接 和硬链接两种,软链接就是ln -s src dst,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间。
硬链接ln src dst,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件 都保持同步变化。
3、指向一个文件的所有 硬链接都删掉的话文件的内容才会被删掉。
link功能的连接方式是:
ln(即link) 的功能是为某一个文件在另外一个位置建立一个同步的连接。有两种连接方式,一种是硬链接(hard link),另一种是符号链接(symbolic link),又称软链接。
硬链接和原有文件是存储在同一物理地址的两个不同的名字,因此硬链接是相互的;符号链接的内容只是一个所链接文件的文件名,在使用ls –l时,符号链接的第一项的第一位为“l”。
当在不同的目录,用到相同的文件时,可以不需要在每一个需要的目录下都放一个必须相同的文件,只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
1、在/run目录下存放文件,但是/run目录剩余3.5G了,空间很小,根目录还有42G空余空间,我们可以将文件放在/目录,然后软连接到/run目录下。
2、创建软连接:/root/zhang目录下存在图中zabbix这个安装包,文件过大,我们创建软连接到/run目录,让/run/wang目录也可以访问到。
3、in -s[源文件或目录] [目标文件或目录]ln -s是必须的,然后后面跟一个目标文件夹,最后是一个当前目录的软连接名。
4、删除软连接,不要进行实际存储文件的路径进行删除,可能会误删除实际存放的数据。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)