系统数据文件和信息

  系统正常运行需要使用大量系统数据文件,其中,所有UNIX系统都有的是:口令文件、组文件,大多数系统都提供的是:登录账户记录、系统标识、时间和日期例程,同时还有其他一些常用系统数据文件如:BSD网络软件有一个记录各网络服务器所提供服务的数据文件(/etc/services)、记录协议住处的数据文件(etc/protocols)等。

  1、口令文件

  口令文件包括了以下字段,这些字段包含在<pwd.h>中定义的passwd结构中:

struct passwd

  char*  pw_name;          //用户名

  char*  pw_passwd;    //加密口令

  uid_t  pw_uid;              //数值用户ID

  gid_t  pw_gid;              //数值组ID

  char*  pw_gecos;          //注释字段

  char*  pw_dir;               //初始工作目录

  char*  pw_shell;            //初始shell(用户程序)

  char*  pw_class;            //用户访问类

  time_t  pw_change;        //下次更改口令时间

  time_t  pw_expire;          //账户有效期时间

};

(1)POSIX.1只定义了两个获取口令文件相的函数。在给出用户登录名或者数值用户ID,这两个函数允许我们通过查找相关项

#include <pwd.h>

struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
//两者成功都返回指针,失败返回NULL

getpwuid函数被ls程序使用,它将i节点中的数值用户ID数值映射到一个用户登录名,在键入登录名时候,getpwnam函数被login(1)函数使用。

(2)以下三个函数可以用于程序查看整个口令文件

#include <pwd.h>

struct passwd *getpwent(void);
//成功返回指针,失败或文件结尾返回NULL。

void setpwent(void);
void endpwent(void);

调用getpwent时,它返回口令文件中下一个记录项,函数setpwent反绕它所使用的文件,endpwent则关闭这些文件,在使用getpwent查看完口令文件后,一定要调用endpwent关闭这些文件。

  2、阴影口令

  为了更难获取原始资料(加密口令),某些系统把加密密码存在另一个通常被称为影子密码的文件中,该文件最少必须包含用户名和加密密码。其它密码相关的信息同样也存在该文件,看下表:

文件/etc/shadow的域
描述 结构体spwd成员
用户登录名 char *sp_namp
加密密码 char *sp_pwdp
最后修改密码的自Epoch的天数 int sp_lstchg
直到改变允许的天数 int sp_min
需要改变之前的天数 int sp_max
警告密码到期的天数 int sp_warn
帐号失效前的天数 int sp_inact
帐号过期的自Epoch距今的天数 int sp_expire
保留 unsigned int sp_flag

与访问口令文件的一组函数类似,有另一组函数可用于访问阴影口令文件

与访问口令文件的一组函数类似,有另一组函数可用于访问阴影口令文件

#include <shadow.h>

struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
//两者成功时都返回指针,否则返回NULL。

void setspent(void);
void endspent(void);

3.组文件

1).可以用下面由POSIX.1定义的两个函数查看组名或组ID

#include <grp.h>

struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
//两者成功都返回指针,否则返回NULL。

和口令文件函数一样,这两个函数通常都返回一个静态变量的指针,每次调用时都被重写该静态变量。

2).如果需要查找整个组文件,则需要使用另外几个函数,以下三个函数类似于针对口令文件的三个函数:

#include <grp.h>

struct group *getgrent(void);
//成功返回指针,失败或文件尾返回NULL。

void setgrent(void);
void endgrent(void);

4.附加组ID

使用附加组ID的好处是我们不再需要显式地改变组

#include <unistd.h>

int getgroups(int gidsetsize, gid_t grouplist[]);
//成功返回补充组ID的数量,错误返回-1。

#inlcude <grp.h> /* on Linux */
#inlcude <unistd.h> /* on FreeBSD, Mac OS X, and Solaris */

int setgroups(int ngroups, const gid_t grouplist[]);

#inlcude <grp.h> /* on Linux and Solaris */
#inlcude <unistd.h> /* on FreeBSD and Mac OS X */

int initgroups(const char *username, gid_t basegid);
//两者成功都返回0,否则返回-1。

5.其他数据文件

对于每个数据文件有至少三个函数

1).get函数,读取下一个记录,必要时打开这个文件。这些函数通常返回一个结构体的指针。当到达文件尾时一个空指针被返回。多数get函数返回一个静态结构体的指针,所以我们如果想保存它则总是需要拷贝它。

2).set函数,如果文件没打开的话打开这个文件,并回退这个文件。这个函数在我们知道我们想从文件开头重新开始时被使用。

3).end项,关闭数据文件。正如我们早先提到的,我们总是需要在完成工作时调用它,来关闭所有的文件。

下面表里有所有数据文件的get、set和end函数:

访问系统数据文件的类似函数
描述 数据文件 头文件 结构体 补充的关键字查找函数
密码 /etc/passwd <pwd.h> passwd getpwnam, getpwuid
/etc/group <grp.h> group getgrnam, getgrgid
影子 /etc/shadow <shadow.h> spwd getspanam
主机 /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, getservbyport

6.登陆账户记录

大多数UNIX系统提供的两个数据文件是:utmp文件,它记录当前登录系统的各个用户;wtmp文件,它记录所有的登陆与注销事件。在V7,一个记录类型被这两个文件写,一个与下面结构体一致的二进制记录

struct utmp {
  char ut_line[8]; /* tty line: "tyh0", "ttyd0", "ttyp0", ... */
  char ut_name[8]; /* login name */
  long ut_time; /* seconds since Epoch */
}; 

7.系统标识

1).POSIX.1定义了uname函数,它返回当前主机和操作系统的有关信息

#include <sys/utsname.h>

int uname(struct utsname *name);
//成功返回非负值,失败返回-1。

一个utsname结构体:

struct utsname {
  char sysname[];  /* name of the operating system */
  char nodename[]; /* name of hits node */
  char release[]; /* current release of operating system */
  char version[]; /* current version of this release */
  char machine[]; /* name of hardware type */
}; 

2).基于BSD的系统提供了gethostname函数来只返回主机的名字。这个名字通常是在TCP/IP网络上的主机名。

#include <unistd.h>

int gethostname(char *name, int namelen);
//成功返回0,失败返回-1。

namelen参数指定了name缓冲的长度。如提供了足够的空间,返回的字符串以null结尾。如果没有提供足够的空间,没有指定这个字符串是否以null结尾。

8.时间和日期例程

1).time函数返回当前的时间和日期。

#include <time.h>

time_t time(time_t *calptr);
//成功返回时间值,错误返回-1。

2).gettimeofday函数提供了比time函数更好的精度(精确到微秒)

#include <sys/time.h>

int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
//返回值:总是返回0。

timeval结构体

struct timeval {
  time_t tv_sec;  /* seconds */
  long tv_usec; /* microseconds */
};

3).localtime和gmtime

#include <time.h>

struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
//两者都返回分解时间的指针。

localtime和gmtime这两个函数把日历时间转换了一个被称为分解时间(broken-down time)的一个结构体tm:

struct tm {  /* a broken-down time */
  int tm_sec;  /* seconds after the minute: [0 - 60] */
  int tm_min;  /*  minutes after the hour: [0-59] */
  int tm_hour;  /* hours after midnight:[0-23] */
  int tm_mday;  /* day of the month: [1-31] */
  int tm_mon;  /* months since January: [0-11] */
  int tm_year;  /* years since 1900 */
  int tm_wday;  /* days since sunday: [0-6] */
  int tm_yday;  /* days since January 1: [0-365] */
  int tm_isdst;  /* daylight saving time flag: <0, 0, >0 */
}; 

localtime和gmtime的区别在于第一个把日历时间转换为本地时间,根据时区和夏令时标志,而后者把日历时间转换成一个表示为UTC的分解时间

4).函数mktime接受一个表示为本地时间的分解时间,并把它转换成一个time_t值

#include <time.h>

time_t mktime(struct tm *tmptr);
//成功返回日历时间,错误返回-1

5).asctime和ctime函数生产熟悉的26字节字符串

#include <time.h>

char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);
//两者都返回以null结尾的字符串。

6).strftime,是最复杂的。它是一个对于时间值类似于printf的函数

#include <time.h>

size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);
//如果空间足够返回存储在数组里的字符数,否则返回0。

最后的参数是格式所需的时间值,由一个分解时间值的指针指定。格式化的结构存储在尺寸为maxsize的buf数组里。如果包括终止null的结果的尺寸,可以放入这个缓冲,那么函数返回在buf里存储的字符数,不包括终止null。否则,该函数返回0。

转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/03/2621445.html

时间: 2024-10-01 04:40:44

系统数据文件和信息的相关文章

(四) 一起学 APUE 之 系统数据文件和信息

. . . . . 目录 (一) 一起学 APUE 之 标准 IO (二) 一起学 APUE 之 文件 IO (三) 一起学 APUE 之 文件和目录 (四) 一起学 APUE 之 系统数据文件和信息 1.getpwnam(3).getpwuid(3) 1 getpwnam, getpwuid - get password file entry 2 3 #include <sys/types.h> 4 #include <pwd.h> 5 6 struct passwd *getp

APUE学习笔记:第六章 系统数据文件和信息

6.1 引言 UNIX系统的正常运行需要使用大量与系统有关的数据文件,针对这些数据文件的可移植接口是本章的主题.本章还介绍了系统标识函数.时间和日期函数 6.2 口令文件 UNIX系统的口令文件包含了下列各字段,这些字段包含在<pwd.h>中定义的passwd结构中 用户名 char *pw_name 加密口令 char *pw_passwd 数值用户ID uid_t pw_uid 数值组ID gid_t pw_gid 注释字段 char *pw_gecos 初始工作目录 char *pw_d

《UNIX环境高级编程》--6系统数据文件和信息

系统数据文件和信息 用户配置文件 1. /etc/passwd UNIX口令文件 /etc/passwd/是一个ASCII文件,每一行包含很多字段,字段之间用冒号分隔.这些字段包含在<pwd.h>头文件定义的passwd,该结构有如下成员: char *pw_name:用户名 char *pw_passwd:加密口令 uid_t pw_uid:数值用户ID gid_t pw_gid:数值组ID char *pw_gecos:注释字段 char *pw_dir:初始工作目录 char *pw_s

Unix环境高级编程学习笔记(三):标准I/O , 系统数据文件和信息

1 标准I/O函数不同于read,write函数,是其在流上进行操作, 当首次调用标准I/O函数时,系统会首先调用malloc,为流创造缓冲区, 2 fopen函数 #include<stdio.h> file * fopen(const char* pathname, const char * restrict name); 打开返回指针,出错返回NULL, type的取指有r(读),w(写),a(追加),r+/w+(读+写),a+(读+写+追加) int fclose(file* fp)

读书笔记-APUE第三版-(6)系统数据文件和信息

常见系统数据文件 下表列出了常见的系统数据文件及其查找函数. 以/etc/passwd文件为例,读取数据的程序基本框架如下: void get_pw_entry() { struct passwd *ptr; setpwent(); while ((ptr = getpwent()) != 0) { -- } endpwent(); return ptr; } 每个数据文件都提供了一个get方法返回文件下一个记录项. set方法充值当前位置到文件开始处. end方法关闭数据文件. 表格中的get

APUE学习笔记(第六章 系统数据文件和信息)

UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件. 口令文件 UNIX系统口令文件包含如下字段,这些字段包含在<pwd.h>中定义的passwd结构中 口令文件是/etc/passwd,每一行包含上面各字段,字段之间用冒号分隔.可以使用finger命令打印指定用户的有关信息:finger -p 用户名 POSIX.1定义了两个获取口令文件项的函数,在给定用户登录名或数值用户ID后,这两个

APUE读书笔记-第六章 系统数据文件和信息

昨天看完了,今天来看看第六章.感觉第六章的内容不是非常重要.简单看看吧 6.2 口令文件 口令文件其实就是/etc文件夹下的passwd文件,但处于安全性的考虑,我们无法直接读取它.就是通过直接限制权限的方式对其进行保护,passwd文件具体权限如下: -rw-r--r-- 1 root root 可以看到只有root用户具有读写权限,与root同组的用户与其他用户仅具有读权限. 不过为了解决以上问题,Linux中给出了一系列数据结构与函数帮助我们操纵口令文件,首先是关键数据结构,定义位于/in

《UNIX环境高级编程》读书笔记之系统数据文件和信息(1)

1.UNIX系统口令文件包括了下图所看到的的各字段,这些字段包括在<pwd.h>中定义的passwd结构体中 POSIX定义了两个获取口令文件项的函数. 在给出用户登录名或用户ID后.这两个函数就能查看相关项. #include <pwd.h> struct passwd *getpwuid(uid_t uid); struct passwd *getpwnam(const char *name); 假设想要查看整个口令文件,则要用到以下三个函数: #include <pwd

linux c编程:系统数据文件和信息

linux系统相关的文件信息包含在/etc/passwd文件和/etc/group中.每次登录linux系统以及每次执行ls -l命令时都要使用口令文件.这些字段都包含在<pwd.h>中定义的passwd结构中. struct passwd { char * pw_name; /* Username. */ char * pw_passwd; /* Password. */ __uid_t -pw_uid; /* User ID. */ __gid_t -pw_gid; /* Group ID