1. 程式人生 > >Linux系統程式設計【3.1】——編寫ls命令

Linux系統程式設計【3.1】——編寫ls命令

## ls命令簡介 老規矩,直接在終端輸入:man ls (有關於man命令的簡介可以參考筆者前期部落格:[Linux系統程式設計【1】——編寫more命令](https://www.cnblogs.com/lularible/p/14343844.html "Linux系統程式設計【1】——編寫more命令")) [![yNVp0s.md.png](https://s3.ax1x.com/2021/02/07/yNVp0s.md.png)](https://imgchr.com/i/yNVp0s) 可以看到,ls命令的作用是顯示目錄中的檔名,它帶有可選的引數,如'-a'表示顯示所有檔案(包含隱藏檔案,即以'.'開頭的檔案),'-l'表示顯示檔案及檔案屬性等等。 [![yNZQbj.md.png](https://s3.ax1x.com/2021/02/07/yNZQbj.md.png)](https://imgchr.com/i/yNZQbj) 本次部落格就只專注於如何顯示出目錄中的檔名,而顯示檔案屬性這方面的實現將寫在下一篇部落格中。 ## 如何實現初級版ls命令 既然我們的目的是要顯示出目錄中的檔案,基於Linux檔案程式設計的思想,我們只需找到存放指定目錄檔案資訊的那個檔案,然後讀取其中的內容並顯示就可以了。 根據之前對於more和who命令的實現中:開啟檔案、讀取檔案、關閉檔案的思路,可以猜測對於目錄的處理也可能為:開啟目錄、讀取目錄、關閉目錄。 ### 確定工具函式 利用man -k dir查詢到readdir(3)就是我們想要的(另外的兩個readdir(2)和readdir_r(3) man進去看一下描述,確實不是我們需要的)。 [![yNnMrD.md.png](https://s3.ax1x.com/2021/02/07/yNnMrD.md.png)](https://imgchr.com/i/yNnMrD) 由readdir的“SEE ALSO”引出來的還有,opendir和closedir: [![yNuJw4.md.png](https://s3.ax1x.com/2021/02/07/yNuJw4.md.png)](https://imgchr.com/i/yNuJw4) [![yNKSnU.md.png](https://s3.ax1x.com/2021/02/07/yNKSnU.md.png)](https://imgchr.com/i/yNKSnU) 這裡插一句,我們之前的思路是找到儲存目錄資訊的檔案,然後對這個檔案內容進行處理。但是筆者發現這些檔案不容易找到,好在linux已經給我們提供了處理這種事的工具函式,如這個readdir函式,傳入目錄指標(由opendir函式獲得,而opendir函式僅需傳入目錄名)就可以獲得一個包含所需資訊的結構體指標。 這就好比是你要的東西在倉庫(存目錄相關資訊的檔案)裡,但是倉庫的位置(檔案路徑)你一下找不到,並且裡面放有各種東西(各種引數),要自己去挑選(選出自己所需的資料),最後再自己扛出來並關倉庫門(格式處理、資料複製、關閉檔案等等)。現在好了,有了幾個代理人,他們對倉庫很熟悉,一下子就能找到倉庫位置(opendir函式),然後根據位置拿裡面的東西並打包出來交給你(readdir函式),最後還替你關倉庫門(closedir函式),多舒服的一件事情。 找到這三個代理人(opendir/readdir/closedir)後,把整套流程交給他們去做,我們拿到打包好的東西(struct dirent)再自己簡單處理下就行了。 ### 確定所需引數 readdir函式返回的是一個dirent結構體指標,這個dirent結構體中包含的d_name(檔名)就是我們需要的。 所以整個的ls命令實現流程為: 1.opendir開啟指定目錄 迴圈:{ 2.readdir獲得目錄中每一個檔案的dirent結構體 3.列印結構體中的d_name字串 } 4.closedir關閉指定目錄 ### ls命令原始碼 ```c /* * ls01.c * writed by lularible * 2021/02/07 */