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