Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104573175
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-03-29 10:43:59

关键词: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
#include
#include
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
 
阅读(620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~