• 获取系统数据文件信息


    前言

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

  • 相关阅读:
    SQLite数据库框架ORMLite与GreenDao的简单比较
    Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
    admin嵌套在spring mvc项目里,菜单栏点击新连接每次都会重置
    Spring MVC视图层:thymeleaf vs. JSP
    使用Spring标签库
    SpringMVC中Controller跳转到另一个Controller方法
    有趣iOS开展
    Java日期的格式String类型GMT,GST换算成日期Date种类
    javascript之Style物
    Tair LDB基于Prefixkey中期范围内查找性能优化项目总结
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3668072.html
Copyright © 2020-2023  润新知