今天学习了系同数据文件和信息的一些调用函数和数据结构,现在总结如下:
1.口令文件
口令文件就是/etc/passwd文件
口令文件有一个数据结构用于定义数据,结构如下:
/*
* #include <pwd.h>
* struct passwd{
* char * pw_name; //用户名
* char * pw_passwd; //加密口令
* uid_t pw_uid; //数值用户ID
* gid_t pw_gid; //数值组ID
* char * pw_gecode; //注释字段
* char * pw_dir; //初始工作目录
* char * pw_shell; //初始shelll
* char * pw_class; //用户访问类
* time_t pw_change; //下次更改口令时间
* time_t pw_expire; //账户到期时间
* };
*/
获取某个用户命令文件项的函数有:
/*
* #include <pwd.h>
* struct passwd * getpwuid(uid_t uid); //以用户ID为参数
* struct passwd * getpwnam(const char * name); //以用户名为参数
* 两个函数成功返回口令文件结构指针,出错返回NULL
* 返回的是静态指针
*/
获取整个口令文件信息的函数有:
/*
* #include <pwd.h>
* struct passwd * getpwent(void); //成功返回文件口令结构指针,出错或到达文件尾部返回NULL,返回的是静态指针
* void setpwent(void); //重置读取到的口令项位置
* void endpwent(void); //关闭读取
* getpwent用于读取下一个口令项信息
*/
//演示小程序,读取口令文件中所有用户的用户名和用户ID
#include <pwd.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
int main()
{
struct passwd * ptr;
setpwent();
while ( (ptr = getpwent()) != NULL)
{
printf("Name:%s ID:%d\n",ptr->pw_name,ptr->pw_uid);
}
endpwent();
return 0;
}
2.阴影口令
现在的Linux和Unix一般把用户的口令放在/etc/shadow文件中,而且文件中存放的是通过加密了的密文
我们查看此文件也有一个专门的数据结构,如下所示
/*
* #include <shadow.h>
* 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); //获取指定用户的shadow文件内内容
* struct spwd * getspent(void); //获取下一条口令项内容
* ------------------------------------------------
* 以上两个文件成功返回指针,出错返回NULL
* 函数返回的是静态指针
* ------------------------------------------------
* void setspent(void); //重置读取的口令项位置
* void endspent(void); //关闭读取
*/
3.组文件
讲完了用户的口令文件,现在来讲已讲用户组文件了,用户组文件一般放在/etc/group中
跟用户帐号口令文件一样,有一个专门的数据结构存放这些信息:
/*
* #include <grp.h>
* struct group{
* char * gr_name; //组名
* char * gr_passwd; //组口令
* int gr_gid; //数值组ID
* char ** gr_men; //组内成员的用户名
* }
*/
查看文件信息内的函数如下:
/*
* #include <grp.h>
* struct group * getgrgid(gid_t gid); //取得指定组ID的信息
* struct group * getgrnam(const char * name); //取得指定组名的信息
* 两个函数成功返回指针,出错返回NULL;
* 返回的是静态指针
*/
同样也有用于操作整个文件的函数:
/*
* #include <grp.h>
* struct group * getgrent(void); //取得下一条组的信息
* void setgrent(void); //重置读取组信息的位置指针
* void endgrent(void); //关闭读取组信息
* getgrent成功返回指针,出错或到文件末尾返回NULL
* 返回的是静态指针
*/
4.附加组ID
我们知道,如今的Linux系统都是一个用户可以属于多个组,那么如何设置用户属于哪些组也是有函数的:
/*
* #include <unistd.h>
* #include <grp.h>
* int getgroups(int gidsetsize,gid_t grouplist[]); //成功返回附加组ID数,出错返回-1
* int setgroups(int ngroups,const gid_t grouplist[]);
* int initgroups(const char * username,git_t basegid);
* initgroups和setgroups属于特权操作,只有超级用户能用
*/
5.存取数据文件的类似例程
/*
* 数据文件 头文件 结构 附加的关键字查找函数
* /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,getservbyport
*/
6.系统标识
/*
* #include <sys/utsname.h>
* int uname(struct utsname * name);
* 成功返回非负值,出错返回-1
* 该函数返回当前主机和系统的有关信息,存储到name指定的结构对象中
* ------------------------------------------------
* struct utsname{
* char sysname[]; //操作系统名字
* char nodename[]; //node的名字
* char release[]; //当前操作系统release
* char version[]; //当前release的version
* char machine[]; //机器的类型
* };
* ------------------------------------------------
* #include <unistd.h>
* int gethostname(char * name,int namelen);
* 成功返回0,失败返回-1
* 该函数用于返回主机名,名字是TCP/IP网络上主机的名字
* 返回的名字存储在name缓冲区中,namelen是缓冲区长度
*/
7.时间和日期例程
/*
* #include <time.h>
* time_t time(time_t * calptr); //成功返回当前时间和日期,存放在calptr中;出错返回-1
* -----------------------------------------
* #include <sys/time.h>
* int gettimeofday(struct timeval * restrict tp,void * restrict tzp);
* 函数总是返回0,该函数用于获取更精确的时间(最高为微妙级)
* -----------------------------------------
* 上述的timeval结构如下:
* struct timeval{
* time_t tv_sec; //秒
* long tv_usec; //微妙
* };
* -----------------------------------------
* #include <time.h>
* struct tm * gmtime(const time_t * calptr); //获取时间转换程国际标准时间的年,月,日,时,分,秒,周日.
* struct tm * localtime(const time_t * calptr); //将日历时间转换程本地时间
* time_t mktime(struct tm * tmptr); //以本地时间的年,月,日等作为参数,转换为time_t值
* char * asctime(const struct tm * tmptr); //以年,月,日等指针参数装换为26字节的字符串
* char * ctime(const time_t * calptr); //将日历时间的指针参数转换为26字节的字符串
* size_t strftime(char * restrict buf,size_t maxsize,const char * restrict format,
* const struct tm * restrict tmptr); //对时间进行格式化到buf中
* -----------------------------------------
* 其中,tm结构如下:
* struct tm{
* int tm_sec; //分钟中的秒数【0-60】
* int tm_min; //小时中的分钟数【0-59】
* int tm_hour; //小时数【0-23】
* int tm_mday; //月中的天数【1-31】
* int tm_mon; //月数【0-11】,0是一月
* int tm_year; //年份,与1900年的差值
* int tm_wday; //星期几【0-6】,0是星期天
* int tm_yday; //年中的天数【0-365】,0是一月一日
* int tm_isdst; //时间保存标记,< 0, 0, 0>
* };
*/
各时间函数的转换图,(转在于http://blog.youkuaiyun.com/wyuan8913/article/details/7668721,点击打开链接)
另外,时间格式转换符也可参考http://blog.youkuaiyun.com/wyuan8913/article/details/7668721,点击打开链接