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,点击打开链接
- Linux系统编程学习之《系统数据文件和信息》
- 【Linux】系统数据文件和信息
- Linux系统数据文件和信息
- linux系统数据文件和信息--unix环境高级编程读书笔记
- UNIX环境高级编程学习之第六章系统数据文件和信息-实现uid to name
- UNIX环境高级编程学习之第六章系统数据文件和信息-GID To GroupName
- UNIX环境高级编程学习之路(四)----系统数据文件和信息
- 系统数据文件和信息
- 系统数据文件和信息
- Linux/UNIX系统数据文件和信息
- UNIX再学习 -- 系统数据文件和信息
- UNIX环境高级编程学习之第六章系统数据文件和信息-取所有用户名和UID, GID
- UNIX环境高级编程学习之第六章系统数据文件和信息-取所有组名、GID
- linux 系统数据文件与信息
- unix系统数据文件和信息
- 【APUE】系统数据文件和信息
- (六) 系统数据文件和信息
- Unix 系统数据文件和信息
- ubuntu13.04下安装jdk7
- Android 实现图片的圆角,倒影,转换
- poj——1159(dp之最长公共子序列)
- 由localtime引发的函数可重入问题
- [leetcode] Surrounded Regions
- Linux系统编程学习之《系统数据文件和信息》
- POJ 3617
- IO流类图
- POJ -- 3468 --线段树成段更新
- C 运行时库的使用,使用第三方库的时候尤其重要
- Android系统源代码情景分析:基础知识
- Mingw连接boost thread库时的一个问题
- 2013大学英语六级考试 改革样题及答案
- 模式识别方向2014年主要会议deadline