本文章介绍有关系统数据文件和信息的函数
1.一切皆文件
linux操作系统的特点就是一切皆文件,所以仅通过操作文件就可以操作linux的所有。
2.口令文件
/etc/passwd
这些字段定义在<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_shell //初始shell(用户程序)
char *pw_class //用户访问类
time_t pw_change //下次更改口令时间
time_t pw_expire //账户到期的时间
在linux系统上,该文件中表示如下:
root:x:0:0:/root:/bin/bash
用户名:加密口令:用户ID:组ID:工作目录:shell
获取口令文件的函数:
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
//成功返回指针,出错返回NULL
3.阴影口令
/etc/shadow
阴影口令是经单项加密算法处理过的用户口令副本。这些字段定义在<shadow.h>中的shadow结构中
char *sp_name //用户登录名
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);
//成功返回指针,失败返回NULL
void setspent(void);
void endspent(void);
4.组文件
/etc/group
这些文件定义在<grp.h>中所定义的group
char *gr_name //组名
char *gr_passwd //加密口令
int gr_gid //数值组ID
char **gr_mem //指向各用户名的指针的数组
查看组名或数值组ID
#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
//成功返回指针,出错返回NULL
5.附加组ID
我们不仅可以属于口令文件记录项中的组ID所对应的组,也可以属于多达16个另外的组。
为了获取和设置附加组ID,有以下函数
#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
//成功则返回附加组ID数,若出错则返回-1
#include <grp.h>
#include <unistd.h>
int setgroups(int ngroups, const gid_t grouplist[]);
#include <grp.h>
#include <unistd.h>
int initgroups(const char *username, gid_t basegid);
//成功返回0, 错误返回-1
6.登录账户记录结构
struct utmp {
char ut_line[8];
char ut_name[8];
long ut_time;
};
7.时间和日期
time函数返回当前时间和日期
#include <time.h>
time_t time(time_t calptr);
//成功返回时间,失败返回-1,若参数不为空,则时间也存放在由calptr所指向的空间里
下面这个函数将时间精确到最高为微秒级
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
//总是返回0
timeval{
time_t tv_sec; //秒
long tv_usec; //微秒
};
下面两个函数将日历时间转换到以年月日十分秒结构的时间格式存放在struct tm中
struct tm {
int tm_sec; //秒(0-59)
int tm_min; //分(0-59)
int tm_hour; //时(0-23)
int tm_mday; //月日期(1-31)
int tm_mon; //月,从一月到现在经过的月份(0-11)
int tm_year; //年,从1900年到现在经过的年
int tm_wday; //星期日期(0-6),0代表Sunday
int tm_yday; //年日期(0-365)
int tm_isdst; //夏令时的标识,若实行夏令时该值为正,若不实行则为0,不了解为负
};
#include <time.h>
struct tm *gmtime(const time_t *calptr); //转换成国际标准时间
struct tm *localtime(const time_t *calptr); //转换成本地时间
//返回指向struct tm结构体的指针
下面的函数将年月日等作为参数,转换成time_t类型
#include <time.h>
time_t mktime(struct tm *tmptr);
下面函数将时间转换成大家熟悉的26的字节的字符串
#include <time.h>
char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);
//指向以null结尾的字符串的指针
下面函数是自定义时间格式:
#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize,
const char *restrict format,
const struct tm *restrict tmptr);
//成功返回存到buf中的字符数,否则返回0
strftime的转换说明
%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
1.一切皆文件
linux操作系统的特点就是一切皆文件,所以仅通过操作文件就可以操作linux的所有。
2.口令文件
/etc/passwd
这些字段定义在<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_shell //初始shell(用户程序)
char *pw_class //用户访问类
time_t pw_change //下次更改口令时间
time_t pw_expire //账户到期的时间
在linux系统上,该文件中表示如下:
root:x:0:0:/root:/bin/bash
用户名:加密口令:用户ID:组ID:工作目录:shell
获取口令文件的函数:
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
//成功返回指针,出错返回NULL
3.阴影口令
/etc/shadow
阴影口令是经单项加密算法处理过的用户口令副本。这些字段定义在<shadow.h>中的shadow结构中
char *sp_name //用户登录名
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);
//成功返回指针,失败返回NULL
void setspent(void);
void endspent(void);
4.组文件
/etc/group
这些文件定义在<grp.h>中所定义的group
char *gr_name //组名
char *gr_passwd //加密口令
int gr_gid //数值组ID
char **gr_mem //指向各用户名的指针的数组
查看组名或数值组ID
#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
//成功返回指针,出错返回NULL
5.附加组ID
我们不仅可以属于口令文件记录项中的组ID所对应的组,也可以属于多达16个另外的组。
为了获取和设置附加组ID,有以下函数
#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
//成功则返回附加组ID数,若出错则返回-1
#include <grp.h>
#include <unistd.h>
int setgroups(int ngroups, const gid_t grouplist[]);
#include <grp.h>
#include <unistd.h>
int initgroups(const char *username, gid_t basegid);
//成功返回0, 错误返回-1
6.登录账户记录结构
struct utmp {
char ut_line[8];
char ut_name[8];
long ut_time;
};
7.时间和日期
time函数返回当前时间和日期
#include <time.h>
time_t time(time_t calptr);
//成功返回时间,失败返回-1,若参数不为空,则时间也存放在由calptr所指向的空间里
下面这个函数将时间精确到最高为微秒级
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
//总是返回0
timeval{
time_t tv_sec; //秒
long tv_usec; //微秒
};
下面两个函数将日历时间转换到以年月日十分秒结构的时间格式存放在struct tm中
struct tm {
int tm_sec; //秒(0-59)
int tm_min; //分(0-59)
int tm_hour; //时(0-23)
int tm_mday; //月日期(1-31)
int tm_mon; //月,从一月到现在经过的月份(0-11)
int tm_year; //年,从1900年到现在经过的年
int tm_wday; //星期日期(0-6),0代表Sunday
int tm_yday; //年日期(0-365)
int tm_isdst; //夏令时的标识,若实行夏令时该值为正,若不实行则为0,不了解为负
};
#include <time.h>
struct tm *gmtime(const time_t *calptr); //转换成国际标准时间
struct tm *localtime(const time_t *calptr); //转换成本地时间
//返回指向struct tm结构体的指针
下面的函数将年月日等作为参数,转换成time_t类型
#include <time.h>
time_t mktime(struct tm *tmptr);
下面函数将时间转换成大家熟悉的26的字节的字符串
#include <time.h>
char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);
//指向以null结尾的字符串的指针
下面函数是自定义时间格式:
#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize,
const char *restrict format,
const struct tm *restrict tmptr);
//成功返回存到buf中的字符数,否则返回0
strftime的转换说明
%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号