每一个文件,都可以通过一个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操作。

举个例子简单说明:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h> int main()
{
int fd;
//char buf[32];
struct stat buf; //没有打开文件之前线测试链接数
if(stat("abc", &buf) !=)
printf("stat file fail \n");
printf("1. link =%d \n", buf.st_nlink); //打开已经存在的abc
fd = open("abc", O_RDONLY);
stat("abc", &buf);
printf("2. link =%d \n", buf.st_nlink); //关闭文件测试链接数
close(fd);
stat("abc", &buf);
printf("3. link =%d \n", buf.st_nlink); //创建硬链接,测试链接数
if(link("abc", "abc1"))
printf("link abc fail\n");
stat("abc", &buf);
printf("4. link =%d \n", buf.st_nlink); //删除abc1,测试链接数
if(unlink("abc1") == )
printf("\tdelete abc1\n");
stat("abc", &buf);
printf("5. link =%d \n", buf.st_nlink); //重复步骤2
fd = open("abc", O_RDONLY);
stat("abc", &buf);
printf("2. link =%d \n", buf.st_nlink); //删除abc
if(unlink("abc") == )
printf("\tdelete abc\n");
fstat(fd, &buf);
printf("7. link =%d \n", buf.st_nlink); close(fd);
return ;
}

为保证有abc,先执行: touch abc, 然后编译运行:

. link =
. link =
. link =
. link =
delete abc1
. link =
. link =
delete abc
. link =

最新文章

  1. Sharepoint页面项目展示画廊纯前端实现,后端用list/library简单维护
  2. texrecon进行纹理映射
  3. [Java Basics] Collection
  4. hdu 1106:排序(水题,字符串处理 + 排序)
  5. JS 日历控件
  6. Oracle 事务相关的一些测试
  7. Windows中进程的内存结构
  8. iOS 中client和server的 Web Service 网络通信 (2)
  9. CF Round #354 Div.2
  10. PADS Layout VX.2.3 制作PCB封装(Decal)时,导入DXF文件
  11. (转)JDK 1.8 预览版Lambda语法分析
  12. Spring AOP实战例子与springmvc整合不起效果的解决办法
  13. C#语法糖(Csharp Syntactic sugar)
  14. ThinkPHP5基础学习(慕课版)
  15. java基础梳理--朝花夕拾(二)
  16. Chapter5 生长因子、受体和癌症
  17. linux每日命令(25):Linux文件类型与扩展名
  18. VBA 自动得到分数
  19. iOS开源项目周报0330
  20. 人工智能AI芯片与Maker创意接轨(下)

热门文章

  1. emctl start dbconsole OC4J_dbconsole*** not found
  2. Delphi XE10让android的界面设计摆脱繁杂
  3. scrollView的几个属性contentSize contentOffset contentInset
  4. 徐汉彬:Web系统大规模并发——电商秒杀与抢购
  5. SQLite入门与分析(八)---存储模型(3)
  6. android usb host 读写USB设备
  7. 发现一个好的开源项目:lomoX(挑着看,每天看一点,看一年就ok了)——用Webkit开发桌面软件,炫
  8. Android网络请求心路历程
  9. iOS上获得MAC地址
  10. 【HDOJ】3505 Writing Robot