APUE 1-3.c列出一個目錄中的所有檔案

2puT發表於2016-07-06

1-3.c程式,必須指出,apue.h 中包含的出錯例程(函式)僅用於將資訊輸出到標準錯誤;

當程式作為守護程式執行時,需要有另外的出錯例程(函式)來處理守護程式可能輸出的資訊,例如與 syslog 程式通訊並記錄到日誌等,

限於篇幅,這裡沒有整合相應的原始碼,有興趣的童鞋,請參考

《UNIX 環境高階程式設計(第三版)》一書中,第727頁開始的內容



my_LS_command_implement.c  程式的功能很簡單,它通過使用者在 shell 命令列中指定的絕對路徑,來列出該目錄下的內容


該程式第7,8行分別定義了 DIR 結構型指標與 dirent 結構型指標,用於指向後面

opendir() 與 readdir() 函式返回的內容;

1
2
    DIR            *dp;
    struct dirent    *dirp;



第10~11行首先判斷,使用者輸入的 shell 命令列引數個數(命令列引數個數通過 main 函式的第一個引數 argc 傳遞;命令列引數內容通過 main 函式的第二個引數 argv[] 傳遞)是否有2個,如果沒有2個,則呼叫作者編寫的標準出錯例程提醒使用者:必須指定要開啟的目錄;

1
2
    if (argc != 2)
        err_quit("usage: ls directory_name");




第13~14行呼叫庫函式 opendir 開啟使用者指定的目錄,該目錄通過 argv[1] 傳遞給 opendir(),通過將後者返回的值(DIR結構型變數)賦給 dp 並判斷:如果 dp 為空指標則說明開啟目錄失敗,此時呼叫作者編寫的標準出錯例程提醒使用者:無法開啟指定的目錄;

1
2
    if ((dp = opendir(argv[1])) == NULL)
        err_sys("can't open %s", argv[1]);



第15~16行將指向 opendir() 成功開啟的目錄( DIR 結構型變數)的指標 dp 作為引數傳遞並在一個 while 迴圈中反覆呼叫庫函式 readdir ,將後者返回的值(dirent結構型變數)賦給 dirp 指標並判斷:如果 readdir() 讀取完目錄中的所有檔案和子目錄,此時 dirp 為空指標,退出迴圈;反之,每當 readdir() 成功讀取目錄中的一個檔案或子目錄,就列印該檔案或目錄的名稱(通過訪問 dirp 指向的 dirent結構的 d_name 成員,該成員儲存名稱)

1
2
    while ((dirp = readdir(dp)) != NULL)
        printf("%s\n", dirp->d_name);



第18行將 dp 指標作為引數傳遞並呼叫庫函式 closedir,用來關閉 opendir()開啟的目錄

1
    closedir(dp);



第19行使用標準的退出程式方式:以引數0呼叫 exit 函式,表示沒有錯誤,正常退出

1
    exit(0);

相關文章