免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9487 | 回复: 2

关于unlink函数 [复制链接]

论坛徽章:
0
发表于 2010-11-28 21:52 |显示全部楼层
今天看APUE提到,unlink函数使文件引用数减一,当引用数为零时,操作系统就删除文件。但若有进程已经打开文件,则只有最后一个引用该文件的文件描述符关闭,该文件才会被删除。
      但平时用ubuntu的时候,即使用gedit之类的编辑器打开了文件,依旧可以删除,只是退出时会询问是否保存为新文件。这是因为gedit使用open之后就立刻调用了unlink吗? 理解不了为什么可以在打开的情况下删除。。。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2010-11-28 23:09 |显示全部楼层
gedit为啥为在open之后调用unlink呢。。。。。

一个inode在OS有两个引用计数,一个静态的,也就是所谓的硬链接个数,这个值是持久性保持,会反映到硬盘上;另一个是动态的,也就是有多少的个进程在使用此inode。这个是动态的,硬盘上根本没有对应记录。姑且不考虑多个硬链接,如果文件没有进程使用之,A进程对其unlink,unlink里就会进行删除操作。如果B进程在打开了此文件,那么A调用的unlink只是将硬链接数减一,便返回了,也就是LZ所说“有其它进程使用时依旧可以删除”。当B进程不使用该文件了,close之,close会检查进程对此文件的引用数。如果还有其它进程引用之,B调用的close只是减少“引用该文件的进程数”。如果B在是最后一个引用此文件的进程而close又检查到文件硬链接为0,则close进行删除操作。

刚才说的是删除文件的进程和引用文件的进程不同。APUE里貌似讲了一个对付临时文件的trick,即新建一个文件后马上unlink之。这时删除文件与引用文件是同一个进程,当进程退出后文件会被自动被删除,无需额外的删除操作。

论坛徽章:
0
发表于 2010-11-29 11:07 |显示全部楼层
回复 2# tempname2

谢谢!的确刚刚看到APUE对付临时文件的trick那里,有点晕。。gedit应该是打开文件以后全部读入内存,然后在内存中进行修改,最后保存的时候才写到硬盘上。可是对与可执行文件,还是没有理解。假设有个可执行文件test,一直在运行,使用lsof test,显示
  1. COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
  2. test    15099 admin txt    REG    8,7     7139 396752 test
复制代码
可是我仍然可以通过rm删除,此时test正在打开,不是应该不能删除,直到test退出吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2021中国系统架构师大会

【数字转型 架构重塑】2021年5月20日-22日第十三届中国系统架构师大会将在云端进行网络直播。

大会为期3天的议程,涉及20+专场,近120个主题,完整迁移到线上进行网络直播对会议组织来说绝非易事;但考虑到云端会议的直播形式可以实现全国各地技术爱好者的参与,也使ITPUB作为技术共享交流平台得到更好的普及,我们决定迎难而上。
http://sacc.it168.com/


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP