- 論壇徽章:
- 1
|
關(guān)鍵詞:ScoUnix 文件系統(tǒng) 目錄結(jié)構(gòu)
上文說了i節(jié)點(diǎn)的結(jié)構(gòu),其中重要的一點(diǎn)就是i節(jié)點(diǎn)結(jié)構(gòu)不含文件名信息,那對(duì)于一個(gè)具體的文件來說,文件名稱是怎么跟其i節(jié)點(diǎn)掛接上的呢?
答案就是目錄,文件名跟i節(jié)點(diǎn)掛接是通過目錄來實(shí)現(xiàn)的,廢話不說,先show下目錄文件的結(jié)構(gòu)。
具體參考:/usr/include/sys/dirent.h (scounix505)
struct dirent {
ino32_t d_ino; /* 文件i節(jié)點(diǎn)*/
off_t d_off; /* 目錄文件開頭至此目錄進(jìn)入點(diǎn)的位移*/
unsigned short d_reclen; /* 文件名長(zhǎng)度*/
char d_name[1]; /* 文件名,這里有點(diǎn)怪,注意是數(shù)字1,具體容后再述*/
};
目錄本身也是一個(gè)文件,其文件內(nèi)容就是上述這么一個(gè)結(jié)構(gòu)表,上面的結(jié)構(gòu),有一點(diǎn)需要先解釋下,注意d_name定義是長(zhǎng)度1(注意是數(shù)字1,不是字母L)。
為什么是1呢?大家都知道字符串是\0結(jié)尾的,豈不是文件名任何時(shí)候都會(huì)溢出?
當(dāng)初unix設(shè)計(jì)者如此定義的原因我也沒找到,但是有一點(diǎn)是確定的,c語言是不檢查數(shù)組邊界的,d_name即使溢出也是沒問題,我想這就是d_reclen存在的理由吧,而且這樣有兩個(gè)好處:一是文件名長(zhǎng)度沒有限制;二是空間沒有浪費(fèi)(ps:以上有猜想成分,盼高手指正,在某些linux系統(tǒng)中,dirent定義是char d_name[NAMEMAXLEN+1])。
上面的結(jié)構(gòu)還說明以下幾個(gè)問題:
1、目錄包含文件;
專業(yè)的說法,文件名是文件i節(jié)點(diǎn)的鏈接。所以一個(gè)文件可以有多個(gè)鏈接,即多個(gè)文件名指向同一個(gè)文件,專業(yè)術(shù)語是多重鏈接,這就是所謂的硬鏈接(這里引申出來一個(gè)符號(hào)鏈接與硬鏈接的區(qū)別,下次再說)。
2、目錄包含子目錄;
道理跟目錄包含文件一樣,目錄的i節(jié)點(diǎn)跟文件的i節(jié)點(diǎn)區(qū)別在于各自的i節(jié)點(diǎn),i節(jié)點(diǎn)結(jié)構(gòu)第一個(gè)字段就描述了文件類型,這個(gè)在文一已經(jīng)說明。
3、目錄節(jié)點(diǎn)都含有.與..這兩個(gè)特殊文件,.代表自身,..代表上級(jí)目錄,可以對(duì)比i節(jié)點(diǎn)看出來。
另外附上一個(gè)小程序,可以驗(yàn)證以上說法:
#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
執(zhí)行exam結(jié)果如下:
[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]
對(duì)比執(zhí)行:l -ia(加i參數(shù)就顯示i節(jié)點(diǎn)),執(zhí)行結(jié)果如下:
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博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/31/showart_511185.html |
|