1. 程式人生 > >Linux命令:ls的實現

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--49                   字顏色: 30--39
                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,但是新建一個普通檔案該欄位值不增加。

第三欄位表示該檔案的屬主使用者

第四欄位表示該檔案的組使用者

第五欄位表示檔案所佔用的大小,以位元組為單位,如果是目錄檔案,則表示該目錄的大小,而不是該目錄下所有檔案的大小

第六欄位表示最後修改的時間

第七欄位很明顯是檔名

下面是該函式的具體實現