求助,关于linux文件系统的引用计数

2012-10-19 23:35:27 +08:00
 tsuibin
我记得以前在阅读资料的时候看到linux系统有关文件引用计数的内容,这次在做一个日志程序的时候就需要用到这个技术了,但是在搜索上忙了一天之后也没找到解决办法,不知v2上面有没有朋友做过这块?
这个引用计数不是指文件的软链接和硬链接,而是在一个进程访问一个文件时,该文件的引用计数会自增1,这也是为什么在打开一个文件,并且unlink后仍然可以读写该文件的原因

相关的shell命令有 lsof 、fuser
非常感谢您的帮助!
5877 次点击
所在节点    Linux
10 条回复
sampeng
2012-10-20 00:28:00 +08:00
搜索最大的问题是各种碎片信息。你很难找到一个系统的知识。。个人建议。。买本unix高级编程。。上面的文件io描述了文件如何存储和系统调用时发生的行为。

文件信息是存在v节点指针上的。
Mooooon
2012-10-20 09:18:31 +08:00
不知道你是要哪个层面的信息,我是做底层驱动的,就我的理解引用计数是在对应文件的kobject里。
ssword
2012-10-20 09:27:45 +08:00
楼主提到的这个引用计数是指inode对象在内存中的引用计数,它会在文件关闭时减少。

(但楼主的问题是什么?
quake0day
2012-10-20 11:35:37 +08:00
tsuibin
2012-10-20 15:46:18 +08:00
@sampeng
@Mooooon
@ssword
@quake0day
非常感谢大家的回复,我要做的是获取文件的引用计数,保证文件的操作已经完成后,将文件移动到其他目录
今天又看了一下内核的虚拟文件系统vfs这块,在进程操作文件时会将改文件信息加载到内核inode, 在strict inode结构体里有atomic_t i_count这个成员为引用计数,但目前还没设计怎么获取;
目前在外地,等我回去了在做进一步研究
tsuibin
2012-10-20 15:46:34 +08:00
@sampeng
@Mooooon
@ssword
@quake0day
非常感谢大家的回复,我要做的是获取文件的引用计数,保证文件的操作已经完成后,将文件移动到其他目录
今天又看了一下内核的虚拟文件系统vfs这块,在进程操作文件时会将改文件信息加载到内核inode, 在strict inode结构体里有atomic_t i_count这个成员为引用计数,但目前还没设计怎么获取;
目前在外地,等我回去了在做进一步研究
ssword
2012-10-20 19:04:09 +08:00
page cache似乎也会给inode对象的引用计数+1的样子...

而且inode对象的引用计数判断为0是不可能的情况,因为那时候inode对象就没了...

将文件移动到其它目录,直接移动就好的,它还是同一个inode。
tsuibin
2012-10-20 23:38:15 +08:00
@ssword 需要判断写操作是否完成,因为在移动之前需要将内容转储
“inode对象的引用计数判断为0是不可能的情况,因为那时候inode对象就没了”
检测程序会打开文件,这个时候内核中应该会有该文件的inode结构,理论上应该可以
cabbala
2012-10-21 11:03:59 +08:00
既然你都知道了lsof和fuser,不如参考下它们的实现。下面是fuser的简单实现(busybox)

http://code.google.com/codesearch#gufiwQeQ0iA/trunk/apps/busybox-1.14.2/procps/fuser.c&ct=rc&cd=2&q=fuser.c&sq=

/*
fuser [options] FILEs or PORT/PROTOs
Find processes which use FILEs or PORTs
-m Find processes which use same fs as FILEs
-4 Search only IPv4 space
-6 Search only IPv6 space
-s Silent: just exit with 0 if any processes are found
-k Kill found processes (otherwise display PIDs)
-SIGNAL Signal to send (default: TERM)
*/

我大概扫了下,应该是通过扫描/proc来实现的。。。
tsuibin
2012-10-21 20:51:39 +08:00
嗯 是通过遍历proc实现的 我想从内核实现 提供一个新 api给用户进程 现在就是怎么获取文件在内核中的 structure inode结构体这里卡住了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/50443

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX