前言
在 Linux 中,系統資料檔案大都不能直接用編輯的方式讀取。如此設計一方面是從安全性考慮,另一方面則是從檔案檢索效率考慮。
本文將以口令檔案 passwd 為例講解讀取 Linux 中系統資料檔案的方法。
基本步驟
1. 包含讀寫該系統資料檔案的專用標頭檔案 ( 如讀寫口令檔案要包含 pwd.h 組檔案則是 grp.h )
2. 使用 set 函式開啟檔案
3. 使用 get 函式讀取下一個記錄
4. 使用 end 函式關閉此檔案
另,如果資料檔案支援某種形式的關鍵字搜尋,則會提供搜尋具有指定關鍵字記錄的例程。如口令檔案提供了 getpwnam 函式尋找具有指定使用者名稱的記錄;getpwuid 函式尋找具有指定使用者ID的記錄。
幾個主要系統資料檔案的例程資訊可參考下表:
程式碼實現
下程式列印口令檔案中的所有使用者名稱:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <pwd.h> 4 5 int main (void) { 6 // 開啟口令檔案 7 setpwent(); 8 9 // 設立指向口令結構體的指標 10 struct passwd *p = NULL; 11 12 // 遍歷口令檔案 13 while (p = getpwent()) { 14 printf ("%s, ", p->pw_name); 15 } 16 printf("\n"); 17 18 // 關閉口令檔案 19 endpwent(); 20 21 return 0; 22 }
附 passwd 結構體:
1 struct passwd 2 { 3 char * pw_name; /* Username, POSIX.1 */ 4 char * pw_passwd; /* Password */ 5 __uid_t pw_uid; /* User ID, POSIX.1 */ 6 __gid_t pw_gid; /* Group ID, POSIX.1 */ 7 char * pw_gecos; /* Real Name or Comment field */ 8 char * pw_dir; /* Home directory, POSIX.1 */ 9 char * pw_shell; /* Shell Program, POSIX.1 */ 10 char *pw_class; 11 time_t pw_change; 12 time_t pw_expire; 13 };
執行測試
小結
1. 除了順序遍歷的方法讀取系統資料檔案( 如本文程式 ),還可以根據某些欄位資訊檢索檔案。
2. 注意到,程式並沒有指定口令檔案的路徑。