现在的位置: 首页 > 综合 > 正文

old《APUE 2e》学习笔记 第六章 系统数据文件和信息

2014年02月17日 ⁄ 综合 ⁄ 共 7659字 ⁄ 字号 评论关闭

 

第六章 系统数据文件和信息

6.1 引言

 

6.2 口令文件

1.口令文件即存放在/etc/passwd中。

   格式如:root:x:0:0:root:/root:/bin/bash

                一次代表:用户名,加密口令,UID,GID,全名,主目录,默认shell

 

2.passwd结构体:

   struct passwd
  {
        char *    pw_name;         /* Username.  */
        char *    pw_passwd;      /* Password.  */
        uid_t      pw_uid;             /* User ID.  */
        gid_t      pw_gid;             /* Group ID.  */
        char *    pw_gecos;         /* Real name.  */
        char *    pw_dir;              /* Home directory.  */
        char *    pw_shell;           /* Shell program.  */
  };

 

3. 函数原型

    struct passwd * getpwuid(uid_t uid);

    struct passwd * getpwnam(const char * name);

    头文件:pwd.h

    返回值:成功返回指针,出错返回NULL。

    函数功能:根据登录名或用户ID,获取口令文件项(passwd结构)

    struct passwd * getpwent(void);     //返回口令文件中的下一个记录项(passwd结构的指针)

    void setpwent(void);                        //使指针定位在文件的开始位置

    void endpwent(void);                       //关闭口令文件

    头文件:pwd.h

    返回值:getpwent()成功返回指针,出错或到达文件末尾返回NULL

    函数功能:3个函数一起使用,查看整个口令文件

 

4. 示例

    **********************   下面是 例 6-1  ***************************

    #include <pwd.h>
    #include <stdio.h>

    int main()
    {
          struct passwd *ptr;
          setpwent();
          while((ptr=getpwent())!=NULL){
                printf("name=%s,uid=%d,gid=%d,dir=%s,shell=%s/n",ptr->pw_name,
                                           ptr->pw_uid,ptr->pw_gid,ptr->pw_dir,ptr->pw_shell);
          }
          return 0;
    }

    **************************************************************

 

 

6.3 阴影口令

 

1.  阴影口令文件存放在/etc/shadow中。

 

2. spwd结构体:

  /* Structure of the password file.  */
  struct spwd
  {
       char *    sp_namp;               /* Login name.  */
       char *    sp_pwdp;               /* Encrypted password.  */
       long int  sp_lstchg;              /* Date of last change.  */
       long int  sp_min;                  /* Minimum number of days between changes.  */
       long int  sp_max;                 /* Maximum number of days between changes.  */
       long int  sp_warn;               /* Number of days to warn user to change the password.  */
       long int  sp_inact;                /*Number of days the account may be inactive.  */
       long int  sp_expire;             /* Number of days since 1970-01-01 until account expires.  */
       unsigned long int sp_flag;   /* Reserved.  */
  };

 

 3.函数原型:

     struct spwd * getspnam(const char *name);

     头文件:shadow.h

     函数功能:根据登录名,返回spwd结构体指针

     返回值:成功返回指针,出错返回NULL

 

     struct spwd *getspent(void);

     void setspent(void);

     void endspent(void);

     头文件:shadow.h

     函数功能:使用这3个函数,读取整个阴影口令文件。使用方法,参考例6-1.

     返回值:getspent成功则返回指针,出错返回NULL。

 

 

6.4 组文件

1、组文件存放在/etc/group

2. group 结构体

  /* The group structure.  */
  struct group
  {
       char *    gr_name;          /* Group name.  */
       char *    gr_passwd;      /* Password.    */
       gid_t  gr_gid;                  /* Group ID.    */
       char **  gr_mem;           /* Member list. */
  };

 

3. 函数原型:

    struct group *getgrgid(gid_t gid);

    struct group *getgrnam(const char *name);

    头文件:grp.h

    函数功能:由组名或组ID来获取组文件的一项(也就是group结构)。

    返回值:成功则返回指针,出错则返回NULL

 

    struct group *getgrent(void);

    void setgrent(void);

    void endgrent(void);

    头文件:grp.h

    函数功能:获取整个组文件

    返回值:getgrent()若成功则返回指针,出错则或到达文件末尾则返回NULL

    使用方法:参看例6-1

 

6.5 附加组ID
1.函数原型

   getgroups(int gidsetsize,gid_t grouplist[]);
   头文件:unistd.h
   函数功能:取得当前用户的所有的组ID。
   返回值:若成功则返回附加组ID数,若出错则返回-1.
 
   setgroups(int ngroups,const gid_t grouplist[]);
   initgroups(const char *username,gid_t basegid);
   头文件:grp.h
   返回值:若成功则返回0,出错则返回-1.

   注意:不会使用这两个函数。

 

2. 示例

 

    ************* 例 6-2 ************************** 
    #include <stdio.h>
    #include <unistd.h>
    int main()
    {
          gid_t list[500];
          int x,i;
          x=getgroups(0,list);
          getgroups(x,list);
          for(i=0;i<x;i++)
          {
                printf("%d:%d/n",i,list[i]);
          }
           return 0;
    }

    ******************************************** 

 

6.6 实现的区别

6.7 其他数据文件

1.读取数据文件至少有这个3个函数:

   (1) get 函数:读取下一个记录。

   (2) set 函数:打开数据文件(如果尚未打开),然后将指针定位在文件开始位置。

   (3) end函数:关闭相应的数据文件。

 

2.存取系统数据文件:

   说明  数据文件            头文件         结构            附加的关键字查找函数

   口令 /etc/passwd      pwd.h        passwd     getpwnam,getpwuid

   组     /etc/group       grp.h          group        getgrnam,getgrgid

   阴影 /etc/shadow     shadow.h   spwd         getspnam

   主机 /etc/hosts        netdb.h      hostent     gethostbyname,gethostbyaddr

   网络 /etc/networks   netdb.h      netent       getnetbyname,getnetbyaddr

   协议 /etc/protocols   netdb.h      protoent    getprotobyname,getprotobynumber

   服务 /etc/services     netdb.h      servent      getservbyname,getservbyname

 

 

6.8 登陆账户记录

1、/var/run/utmp:记录当前登录进系统的各个用户。

2、/var/log/wtmp:它跟踪各个登陆和注销事件。

3、每次写入上面两个文件中的是包含下列utmp结构的一条二进制记录:

           struct exit_status {
                short int e_termination;    /* process termination status */
                short int e_exit;                /* process exit status */
           };

           struct utmp {
                short ut_type;                          /* type of login */
                pid_t ut_pid;                            /* PID of login process */
                char ut_line[UT_LINESIZE];      /* device name of tty - "/dev/" */
                char ut_id[4];                           /* init id or abbrev. ttyname */
                char ut_user[UT_NAMESIZE];   /* user name */
                char ut_host[UT_HOSTSIZE];   /* hostname for remote login */
                struct exit_status ut_exit;       /* The exit status of a process marked as DEAD_PROCESS */
                long int ut_session;                 /* Session ID, used for windowing */
                struct timeval ut_tv;                /* Time entry was made */

                int32_t ut_addr_v6[4];            /* IP address of remote host */
                char __unused[20];                 /* Reserved for future use */
           };

 

6.9 系统标识

1.utsname结构,用于存储当前主机和操作系统的有关信息。

    /* Structure describing the system and machine.  */
   struct utsname
  {

        char sysname[];         /* Name of the implementation of the operating system.  */
        char nodename[];      /* Name of this node on the network.  */
        char release[];           /* Current release level of this implementation.  */
        char version[];           /* Current version level of this release.  */
        char machine[];          /* Name of the hardware type the system is running on.  */
  };

 

2.函数原型:int uname(struct utsname * name);

                    头文件:sys/utsname.h

                    返回值:成功则返回非负值,出错则返回-1.

                   int gethostname(char *name,int namelen);

                    头文件:unistd.h

                    返回值:成功则返回0,出错则返回-1.

 

6.10 时间和日期例程

1.日历时间:用数据类型time_t表示,其值是从1970年1月1日00:00:00:00到现在的秒数。

2.设置当前时间:settimeofday函数

3.时间函数关系图:

 

时间函数的关系

 

 

 

4. 结构体timeval,tm

    struct timeval

   {

         time_t tv_sec;     //seconds

         long tv_usec;       //microseconds

   }

   struct tm
  {
       int tm_sec;             /* Seconds. [0-60] (1 leap second) */
       int tm_min;             /* Minutes. [0-59] */
       int tm_hour;           /* Hours.   [0-23] */
       int tm_mday;         /* Day.     [1-31] */
       int tm_mon;           /* Month.   [0-11] */
       int tm_year;           /* Year - 1900.  */
       int tm_wday;         /* Day of week. [0-6] */
       int tm_yday;          /* Days in year.[0-365] */
       int tm_isdst;          /* DST.     [-1/0/1]*/
 }

 

5.函数原型:

   int gettimeofday(struct timeval *restrict tp,void *restrict tzp);

   头文件:sys/time.h

   返回值:总是返回0

   函数功能:获取当前时间

   注意:tp要定义成结构变量,这样引用"&tp"。

 

    time_t time(time_t * calptr);

    头文件: time.h

    返回值:若成功则返回时间值,若出错则返回-1。

    函数功能:获取当前时间

 

    struct tm *gmtime(const time_t *calptr);

    struct tm *localtime(const time_t *calptr);

    头文件:time.h

    返回值:指向tm结构的指针

 

    time_t mktime(struct tm*tmptr);

    头文件:time.h

    返回值:若成功则返回日历时间,若出错则返回-1.

 

    char *asctime(const struct tm *tmptr);

    char *ctime(const time_t *calptr);

    头文件:time.h

    返回值:指向以null结尾的字符串的指针(如:Tue Feb 10 18:27:38 2004/n/0)。

 

    size_t strftime(char *restrict buf,size_t maxsize,const char *restrict format, const
struct tm *restrict tmptr);

    头文件:time.h

    返回值:若有空间则返回存入数组的字符串,否则返回0

 

 6、localtime,mktime,ctime,strftime受环境变量TZ影响:如果定义了TZ,则这些函数将使用其值以代替系

       统默认时区。如果TZ定义为空串,则使用国际标准时间UTC。

 

链接:ttp://blog.csdn.net/wyjlovec/archive/2009/10/06/4635650.aspx

作者:wyjlovec

QQ:294448030

转载请保留作者信息

 

抱歉!评论已关闭.