Linux命令:ls的實現
單個執行不帶引數的ls命令時,會顯示當前目錄下的檔名
這裡我們用到了兩個函式opendir和readdir。這兩個函式存在於<dirent.h>標頭檔案中用法如下:
還有一個dirent型別的結構體,這裡面有兩個變數
先使用opendir函式開啟一個目錄並建立一個目錄流,然後再呼叫readdir函式獲取該目錄中一個目錄項的資料(inode結點號和檔名)。
具體實現如下
上面這些是ls命令所在檔案的主函式,下面介紹一下實現的引數。
實現引數:
ls -a
ls -l
ls -i
在ls.c檔案中,我們除了有main函式外,還有其他一系列為main函式做輔助的函式
用於分析引數的AnalPara函式
在該函式中,我們使用到了一個全域性變數flag,它的作用是用來標記所出現的引數,
如果argv[i]中第一個字元不是‘-’,那麼我們就把他當成路徑處理,再判斷所給路徑是直接路徑還是間接路徑,若是直接路徑(首字元為‘/’),則直接copy到path字元陣列中,若是間接路徑,就表示當前目錄下的某個子目錄,那麼我們將當前路徑和所給間接路徑連線起來作為最終路徑,copy到path中,傳回主函式。
如果argv[i]中第一個字元是‘-’,那麼我們把他當作引數處理,因為只實現了三個引數,所以我們把可識別的引數的範圍確定在a,l,i三個字元之間。為a時,flag所在記憶體中第一個位置為1,為l時,第二位置為1,為i時,第三位置為1.其他字元flag則每位都是0.將這些資訊傳回主函式,以便於進一步進行處理。
用於輸出檔名的PrintFileName函式
在Linux系統中,每種不同型別的檔案,不同許可權的檔案,都會有不同的顏色來表示,因此我們在這個函式中對檔案的型別和許可權都做了判斷,再利用printf函式將要輸出的檔名設定成相應的顏色。下面是不同程式碼表示的顏色
字背景顏色範圍
40: 黑 30: 黑
41: 紅 31: 紅
42: 綠 32: 綠
43: 黃 33: 黃
44: 藍 34: 藍
45: 紫 35: 紫
46: 深綠 36: 深綠
47: 白色 37: 白色
ANSI控制碼:
QUOTE:
\033[0m 關閉所有屬性
\033[1m 設定高亮度
\03[4m 下劃線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m -- \033[37m 設定前景色
\033[40m -- \033[47m 設定背景色
\033[nA 游標上移n行
\03[nB 游標下移n行
\033[nC 游標右移n行
\033[nD 游標左移n行
\033[y;xH設定游標位置
\033[2J 清屏
\033[K 清除從游標到行尾的內容
\033[s 儲存游標位置
\033[u 恢復游標位置
\033[?25l 隱藏游標
\33[?25h 顯示游標
用於輸出檔案詳細資訊的PrintMoreInfo函式
要想實現-l命令,首先要知道系統的-l引數輸出的每一個資訊分別代表什麼意思。
單獨存在的一個total 72表示該目錄下面所有檔案大小共72k
下面每一行代表的含義都是相同的,
第一欄位表示許可權第一位的-表示不同的檔案型別(普通檔案,管道檔案)。後面九位分別表示,該檔案的屬主,組使用者和其他使用者的讀,寫,執行三種不同的許可權。
第二欄位表示該檔案的硬連結個數。
如果是一個目錄,則第2欄位表示該目錄所含子目錄的個數。
新建一個空目錄,這個目錄的第二欄位就是2,表示該目錄下有兩個子目錄。為什麼新建的目錄下面會有兩個子目錄呢?
因為每一個目錄都有一個指向它本身的子目錄"。" 和指向它上級目錄的子目錄"。。",這兩個預設子目錄是隱藏的。ls -a可以看到
每次在目錄下新建一個子目錄,該目錄第2欄位的值就增1,但是新建一個普通檔案該欄位值不增加。
第三欄位表示該檔案的屬主使用者
第四欄位表示該檔案的組使用者
第五欄位表示檔案所佔用的大小,以位元組為單位,如果是目錄檔案,則表示該目錄的大小,而不是該目錄下所有檔案的大小
第六欄位表示最後修改的時間
第七欄位很明顯是檔名
下面是該函式的具體實現