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