免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3714 | 回复: 0
打印 上一主题 下一主题

Unix文件系统研究、二 目录结构 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2022-03-04 22:35:50
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-29 10:43 |只看该作者 |倒序浏览

关键词: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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31/showart_511185.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP