现在的位置: 首页 > 综合 > 正文

Unix文件系统研究: 2. 目录结构

2018年05月27日 ⁄ 综合 ⁄ 共 2850字 ⁄ 字号 评论关闭
导读: ScoUnix 文件系统 目录结构

    上文说了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
 
明天讨论下符号链接 与 硬链接 区别
后天讨论下掩码的应用及原理

本文转自
unix - 朝花夕拾
http://blog.chinaunix.net/u/13969/showart_365859.html

抱歉!评论已关闭.