Linux系统编程学习之《系统数据文件和信息》

今天学习了系同数据文件和信息的一些调用函数和数据结构,现在总结如下:

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.csdn.net/wyuan8913/article/details/7668721,点击打开链接

另外,时间格式转换符也可参考http://blog.csdn.net/wyuan8913/article/details/7668721,点击打开链接






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值