Unix环境高级编程学习笔记(4)
第六章 系统数据文件和信息
1、口令文件:一般包含用户名,加密口令,数值用户id,数值组id,注释字段,初始工作目录,初始shell,用户访问类,下次更改口令时间,帐号到期时间 注:这些字段包括在<pwd.h>中定义的passwd结构中。
口令文件一般存储在/etc/passwd中:如:root:x:0:0:root:/root:/bin/bash cao:x:1000:1000:Cao,,,:/home/cao:/bin/bash
当shell字段的值为/dev/null时表示阻止任何人以该用户的名义登录系统。
使用finger命令能够查看用户有关信息:cao@cao-Rev-1-0:~/Studying/Unix编程/Chapter6$ finger -p cao
Login: cao Name: Cao
Directory: /home/cao Shell: /bin/bash
On since Fri Jul 29 16:25 (CST) on tty7 from :0
16 minutes 24 seconds idle
On since Fri Jul 29 16:26 (CST) on pts/0 from :0
No mail.
两个获取口令文件项的函数。#include<pwd.h> struct passwd *getpwuid(uid_t uid);(由ls程序使用) struct passwd *getpwnam(const char *name);(由login程序使用) //成功返回指针,出错返回null
#include<pwd.h> struct passwd *getpwent(void);(返回口令文件的下一项)
void setpwent(void);(反绕它所使用的文件) void endpwent(void);(关闭文件)
2、阴影口令:/etc/shadow文件中的字段:
说明 struct spwd成员
用户登录名 char *sp_namp
加密口令 char *sp_pwdp
上次更改口令以来经过的时间 int sp_lstchg
经过多少天后允许更改 int sp_min
要求更改尚剩余的天数 int sp_max
到期警告天数 int sp_warn
账户不活动之前尚余天数 int sp_inact
账户到期天数 int sp_expire
保留 unsigned int sp_flag
访问阴影口令的函数:#include<shadow.h> struct spwd *getspnam(const char *name); struct spwd *getspent(void);
void setspent(void); void endspent(void);
注:阴影口令仅能被用户id是root的程序读取。
3、组文件: <grp.h> group
说明 struct group的成员
组名 char *gr_name
加密口令 char *gr_passwd
数值组id int gr_gid
指向各用户名的
指针数组 char **gr_mem
用于查看组名或数值组id的函数:#include<grp.h>
struct group *getgrpid(gid_t gid);
struct group *getgrnam(const char *name);
搜索整个组文件的函数:#include<grp.h>
struct group *getgrent();
void setgrent();
void endgrent();
4、附加组ID:#include<unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]); 将附加组id填写到grouplist中,最多gidsetsize个。
#include<grp.h>
#include<unistd.h>/*非linux*/
int setgroups(int ngroups, const gid_t grouplist[]); 为进程设置附加组id表
#include<grp.h> /*on linux and Solaris*/
#include<unistd.h>/*非linux 和 solaris*/
int initgroups(const char* username, gid_t basegid);
5、实现的区别:略
6、其他数据文件:这些数据文件的获取类似与口令文件和组文件的接口。一般来说都会提供三个函数:get函数,set函数,end函数,有时会附加关键字搜索接口:
说明 数据文件 头文件 结构 附加的关键字查找函数
口令 /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/network <netdb.h> netend getnetbyname,getnetbyaddr
协议 /etc/protocols <netdb.h> protoent getprotobyname,getprotobynumber
服务 /etc/services <netdb.h> servent getservbyname,getservbyport
7、登录帐号记录
utmp:记录当前登录进系统的各个用户;wtmp文件,跟踪各个登录和注销事件。
8、系统标识
返回与当前主机和操作系统有关信息:#include<sys/utsname.h> int uname(struct utsname *name);
struct utsname{
char sysname[];
char nodename[];
char release[];
char version[];
char machine[];
};
#include<unistd.h> int geyhostname(char *name, int namelen); 返回主机的完全限定域名。
9、时间和日期程例程:
9.1、返回当前时间和日期 #include<time.h> time_t time(time_t *calptr);
9.2、返回当前时间和日期(精度更高) #include<time.h> int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
timeval结构中存储秒和微妙:struct timeval{
time_t tv_sec;
long tv_usec;
};
9.3、localtime和gmtime将日历时间转化成以年、月、日、时、分、秒、周、日表示时间,并将这些存放在tm结构中:
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
除了月日字段,其他字段的值都以0开始。
#include<time.h>
struct tm *gmtime(const time_t *calptr); 转化为国际标准时间
struct tm *localtime(const time_t *calptr); 转化为本地时间
9.4、以本地时间的年、月、日等作为参数,将其转化成time_t值
#include<time.h> time_t mktime(struct tm *tmptr);
9.5、#include<time.h> char *asctime(const struct tm *tmptr); char *ctime(const time_t *calptr);
返回26字节的字符串,例如:Thu Feb 10 18:27:38 2004\n\0
9.6、#include<time.h> size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);
十分复杂,类似于printf的时间值函数