登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SeaRiver Blog

实力才是你一生最好的依靠!

 
 
 

日志

 
 

Unix文件系统研究、二 目录结构  

2009-04-18 01:00:52|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    上文说了i节点的结构,其中重要的一点就是i节点结构不含文件名信息,那对于一个具体的文件来说,文件名称是怎么跟其i节点挂接上的呢?
    答案就是目录,文件名跟i节点挂接是通过目录来实现的,废话不说,先show下目录文件的结构。
 
具体参考:/usr/include/sys/dirent.h (scounix505)

struct dirent {
 ino32_t d_ino;                  /* 文件i节点*/
 off_t   d_off;                  /* 目录文件开头至此目录进入点的位移*/
 unsigned short  d_reclen;       /* 文件名长度*/
 char    d_name[1];              /* 文件名,这里有点怪,注意是数字1,具体容后再述*/
};
 
目录本身也是一个文件,其文件内容就是上述这么一个结构表,上面的结构,有一点需要先解释下,注意d_name定义是长度1(注意是数字1,不是字母L)。
为什么是1呢?大家都知道字符串是\0结尾的,岂不是文件名任何时候都会溢出?
当初unix设计者如此定义的原因我也没找到,但是有一点是确定的,c语言是不检查数组边界的,d_name即使溢出也是没问题,我想这就是d_reclen存在的理由吧,而且这样有两个好处:一是文件名长度没有限制;二是空间没有浪费(ps:以上有猜想成分,盼高手指正,在某些linux系统中,dirent定义是char d_name[NAMEMAXLEN+1])。
 
 
上面的结构还说明以下几个问题:
1、目录包含文件;
专业的说法,文件名是文件i节点的链接。所以一个文件可以有多个链接,即多个文件名指向同一个文件,专业术语是多重链接,这就是所谓的硬链接(这里引申出来一个符号链接与硬链接的区别,下次再说)。
 
2、目录包含子目录;
道理跟目录包含文件一样,目录的i节点跟文件的i节点区别在于各自的i节点,i节点结构第一个字段就描述了文件类型,这个在文一已经说明。
 
3、目录节点都含有.与..这两个特殊文件,.代表自身,..代表上级目录,可以对比i节点看出来。
 
 
 
另外附上一个小程序,可以验证以上说法:
 
#include<sys/types.h>
#include<dirent.h>
#include<unistd.h>
main()
{
 DIR * dir;
 struct dirent * ptr;
 int i;
 dir =opendir("/etc/rc.d");
 while((ptr = readdir(dir))!=NULL)
 {
  printf("[d_name:%12s] [d_ino:%8ld] [off_t:%4ld] [d_reclen:%4ld]\n",ptr->d_name,ptr->d_ino,ptr->d_off,ptr->d_reclen);
 }
 closedir(dir);
}
 
编译方法:cc exam.c -o exam
执行exam结果如下:
[d_name:           .] [d_ino:   30482] [off_t:  12] [d_reclen:  12]
[d_name:          ..] [d_ino:      23] [off_t:  24] [d_reclen:  16]
[d_name:      README] [d_ino:   30483] [off_t:  40] [d_reclen:  20]
[d_name:           0] [d_ino:   30484] [off_t:  52] [d_reclen:  12]
[d_name:           1] [d_ino:   30486] [off_t:  64] [d_reclen:  12]
[d_name:           2] [d_ino:   30488] [off_t:  76] [d_reclen:  12]
[d_name:           3] [d_ino:   30490] [off_t:  88] [d_reclen:  12]
[d_name:           4] [d_ino:   30492] [off_t: 100] [d_reclen:  12]
[d_name:           5] [d_ino:   30494] [off_t: 112] [d_reclen:  12]
[d_name:           7] [d_ino:   30496] [off_t: 124] [d_reclen:  12]
[d_name:           8] [d_ino:   30498] [off_t: 136] [d_reclen:  12]
[d_name:           9] [d_ino:   30500] [off_t: 148] [d_reclen:  12]
[d_name:           6] [d_ino:   34571] [off_t: 512] [d_reclen:  12]
对比执行:l -ia(加i参数就显示i节点),执行结果如下:
total 42
30482 drwxrwxr-x  12 root     sys          512 Jun 27  2002 .
   23 drwxrwxr-x  26 bin      auth        7680 Jul  4 13:21 ..
26927 -rw-r--r--   1 bin      bin         1954 Jun 27  2002 README@
30484 drwxr-xr-x   2 root     sys          512 Jun 27  2002 0
30486 drwxr-xr-x   2 root     sys          512 Jun 27  2002 1
30488 drwxr-xr-x   2 root     sys          512 Jun 27  2002 2
30490 drwxr-xr-x   2 root     sys          512 Jun 27  2002 3
30492 drwxr-xr-x   2 root     sys          512 Jun 27  2002 4
30494 drwxr-xr-x   2 root     sys          512 Jun 27  2002 5
34571 drwxr-xr-x   2 root     sys          512 Jun 27  2002 6
30496 drwxr-xr-x   2 root     sys          512 Jun 27  2002 7
30498 drwxr-xr-x   2 root     sys          512 Jun 27  2002 8
30500 drwxr-xr-x   2 root     sys          512 Jun 27  2002 9
 
  评论这张
 
阅读(559)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018