V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
tsuibin
V2EX  ›  Linux

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

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

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

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

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

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

    将文件移动到其它目录,直接移动就好的,它还是同一个inode。
    tsuibin
        8
    tsuibin  
    OP
       2012-10-20 23:38:15 +08:00
    @ssword 需要判断写操作是否完成,因为在移动之前需要将内容转储
    “inode对象的引用计数判断为0是不可能的情况,因为那时候inode对象就没了”
    检测程序会打开文件,这个时候内核中应该会有该文件的inode结构,理论上应该可以
    cabbala
        9
    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
        10
    tsuibin  
    OP
       2012-10-21 20:51:39 +08:00
    嗯 是通过遍历proc实现的 我想从内核实现 提供一个新 api给用户进程 现在就是怎么获取文件在内核中的 structure inode结构体这里卡住了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   892 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.