前言
在 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. 注意到,程序并没有指定口令文件的路径。