全面Unix程序說明
我們知道隨著Unix系統(tǒng)的不斷普及,使用Unix系統(tǒng)的單位和個人也越來越多,特別是Linux的推出,更是風(fēng)靡全球?;赨nix系統(tǒng)的編程也愈顯重要。今天,我們就來學(xué)習(xí)一個Unix程序的知識。
該程序是一個類似于Unix命令ls 的小工具(取文件名為lx,為了簡單起見,此Unix程序只讀取了文件的字節(jié)數(shù),即st_size)。它可以接受一個參數(shù):指定的目錄;也可以不帶參數(shù),則默認(rèn)為當(dāng)前目錄。Unix程序列出指定目錄及其子目錄中所包含的所有文件的文件名和文件的字節(jié)數(shù),并計算出指定目錄所占磁盤空間的大小。
Unix程序詳細(xì)說明如下(程序清單見附錄):
1-5行:包含在程序中要用到的一些頭文件。
6行:定義常數(shù)TABSPACES為TAB鍵所跳過的空格數(shù),用于規(guī)整后面顯示語句的屏幕格式。
11行:定義一個變量dir_size用于存放指定目錄所占磁盤空間的大小。
12、13行:判斷命令行如果沒有帶參數(shù),則調(diào)用list函數(shù),將指定目錄置為當(dāng)前目錄,并將返回的目錄大小存入變量dir_size中。
14-18行:如果命令行帶的參數(shù)大于一個,則在屏幕上顯示出此命令的簡要語法并退出Unix程序。
19、20行:如果命令行只帶一個參數(shù),則將此參數(shù)作為指定目錄調(diào)用list函數(shù),同時也返回目錄的大小并存入變量dir_size中。
21行:打印出指定目錄及其子目錄所占磁盤空間的大小。
23行:定義list函數(shù),該函數(shù)采用遞歸法列出字符串name所指定的目錄及其子目錄中所包含的文件名和文件的大小,并計算name所指定的目錄所占用的磁盤空間。
26-32行:定義函數(shù)中要用的變量并賦初值。
33行:打印當(dāng)前所操作目錄的目錄名。
34行:開始一個循環(huán)次數(shù)為2的for循環(huán)。第1次循環(huán)找出目錄中包含的所有文件,第2次循環(huán)找出目錄中包含的所有子目錄。
36-40行:打開指定的目錄,如果打開成功則返回指向此目錄的指針,否則返回NULL。Unix程序打印出出錯信息并退出。
41行:開始一個while循環(huán),每循環(huán)一次讀出目錄中的一個文件或子目錄,直到讀出目錄中所有的文件或子目錄,readdir返回NULL表示已讀到此目錄的尾部。
43、44行:判斷讀出的文件的I標(biāo)識號,如果為0,則表示該文件已被刪除。Unix程序繼續(xù)執(zhí)行并讀取下一個文件。
45-47行:在讀出的文件名前加上絕對或相對路徑,以使Unix程序能正確的從文件系統(tǒng)中訪問指定的文件。
48-52行:調(diào)用lstat獲取指定文件的信息,將獲取的信息存儲到結(jié)構(gòu)sbuf中。如果出錯則退出Unix程序。
53行:判斷讀出的文件是否是一個目錄,這個條件用語句(sbuf.st_mode&S_IFMT)==S_IFDIR實現(xiàn)。其它三個條件用于濾除符號鏈接、目錄本身和上一級目錄,以避免出現(xiàn)死循環(huán)。
55-60行:如果是第2次for循環(huán)則遞歸調(diào)用list函數(shù),列出相應(yīng)的子目錄,同時累加目錄所占磁盤空間的大小。
63-71行:如果是第1次for循環(huán)則打印出文件名和文件所占用的字節(jié)數(shù),同時累加所占磁盤空間的大小。用三條打印語句是因為文件名長度不一致,為了打印出的屏幕美觀。
75行:關(guān)閉相應(yīng)的目錄。
77行:返回本目錄所占用的磁盤空間。
本Unix程序在Turbo Linux 4.0和FreeBSD 3.0上調(diào)試運行通過。
【編輯推薦】