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

来源:互联网 发布:银行卡照片制作软件 编辑:程序博客网 时间:2024/05/24 03:21

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

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>passwdgetpwnam,getpwuid * /etc/group<grp.h>groupgetgrnam,getgrgid * /etc/shadow<shadow.h>spwdgetspnam * /etc/hosts<netdb.h>hostentgethostbyname,gethostbyaddr * /etc/networks <netdb.h>netentgetnetbyname,getnetbyaddr * /etc/protocols<netdb.h>protoentgetprotobyname,getprotobynumber * /etc/services<netdb.h>serventgetservbyname,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,点击打开链接






原创粉丝点击