apue学习笔记(第六章 系统数据文件和信息)
UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件。
口令文件
UNIX系统口令文件包含如下字段,这些字段包含在<pwd.h>中定义的passwd结构中

口令文件是/etc/passwd,每一行包含上面各字段,字段之间用冒号分隔。可以使用finger命令打印指定用户的有关信息:finger -p 用户名
POSIX.1定义了两个获取口令文件项的函数,在给定用户登录名或数值用户ID后,这两个函数就能查看相关项
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
下面两个函数可以实现查看整个口令文件
#include <pwd.h>
struct passwd *getpwent(void);
void setpwent(void);
void endpwent(void);
调用getpwent时,它返回口令文件中的下一个记录项。函数setpwent反绕它所使用的文件(定位到文件开始处),endpwent则关闭这些文件,下面给出使用这3个函数实现getpwnam函数的程序
#include <pwd.h>
#include <stddef.h>
#include <string.h> struct passwd *
getpwnam(const char *name)
{
struct passwd *ptr; setpwent();
while ((ptr = getpwent()) != NULL)
if (strcmp(name, ptr->pw_name) == )
break; /* found a match */
endpwent();
return(ptr); /* ptr is NULL if no match found */
}
阴影文件
现在,某些系统将加密口令存放在另一个通常称为阴影口令的文件中:/etc/shadow
与访问口令文件的一组函数相类似,有另一组函数可用于访问阴影口令文件
#include <shadow.h>
struct spwd *getspnam(cosnt char *name);
struct spwd *getspent(void);
void setspent(void);
void endspent(void);
组文件
UNIX组文件包含下图所示字段(/etc/group文件中的字段),这些字段包含在<grp.h>中所定义的group结构中。

字段gr_mem是一个指针数组,其中每一个指针指向一个属于该组的用户名。该数组以null指针结尾。
可以使用下列两个函数来查看组相关项
#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
类似于口令文件,如果需要搜索整个组文件,可以使用下面3个函数
#include <grp.h>
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);
附属组ID
当用户登录时,系统就按口令文件记录项中的数值组ID,赋给它实际组ID。在任何时刻执行newgrp更改组ID
一个用户可能参与多个项目,因此也就要同时属于多个组,使用附属组ID的优点是不必再显式地经常更改组。
为了获取和设置附属组ID,提供了下列3个函数
#include <unistd.h>
int getgroups(int gidsetsize,gid_t grouplist[]);
int setgroups(int ngroups,const gid_t grouplist[]);
int init groups(const char *username,gid_t basegid);
getgroups将进程所属用户的各附属组ID填写到数组grouplist中,最多为gidsetsize个
setgroups可由超级用户调用以便为调用进程设置附属组ID表。
通常,只有initgroups函数调用setgroups,用来设置用户的附属组ID。
其他数据文件
下图给出访问系统数据文件的一些例程

对于这些数据文件的接口都都与上述对口令文件和组文件的相似,一般情况下,对于每个数据文件至少提供一下3个函数
1 get函数:读下一个记录
2 set函数:打开相应数据文件,然后反绕该文件
3 end函数:关闭相应数据文件
系统标识
POSIX.1定义了uname函数,它返回与主机和操作系统有关的信息
#include <sys/utsname.h>
int uname(struct utsname *name);
POSIX.1定义了该结构中最少需提供的字段
struct utsname {
char sysname[]; /* Operating system name (e.g., "Linux") */
char nodename[]; /* Name within "some implementation-defined network" */
char release[]; /* Operating system release (e.g., "2.6.28") */
char version[]; /* Operating system version */
char machine[]; /* Hardware identifier */
}
时间和日期例程
time函数返回当前时间和日期。它是自公元1970年1月1日00:00:00以来经过的秒数(日历时间)
#include <time.h>
time_t time(time_t *calptr);
如果参数非空,则时间值也存放在由calptr指向的单元内。
下面两个函数将日历时间转换成分解的时间,并将这些存放在一个tm结构中
#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
struct tm {
int tm_sec; /* seconds [0-60] */
int tm_min; /* minutes [0-59] */
int tm_hour; /* hours [0-23] */
int tm_mday; /* day of the month [1-31] */
int tm_mon; /* month [0-11] */
int tm_year; /* year since 1900*/
int tm_wday; /* day of the week [0-6]*/
int tm_yday; /* day in the year [0-365]*/
int tm_isdst; /* daylight saving time */
};
mktime函数将tm结构转换成time_t值
#include <time.h>
time_t mktime(struct tm *tmptr);
strftime用于格式化时间值
#include <time.h>
size_t strftime(char *restrict buf,size_t maxsize,const char *restrict format,const struct tm *restrict tmptr);
size_t strftime_l(char *restrict buf,size_t maxsize,const char *restrict format,const struct tm *restrict tmptr,locale_t locale);
下面列出format参数的格式

strptime是strftime的反过来的版本,将字符串时间转换成分解时间
#include <time.h>
char *strptime(const char *restrict buf,const char *restrict format,struct tm *restrict tmptr);
apue学习笔记(第六章 系统数据文件和信息)的更多相关文章
- UNIX系统高级编程——第六章-系统数据文件和信息-总结
口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...
- UNIX环境高级编程 第6章 系统数据文件和信息
UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...
- apue 第6章 系统数据文件和信息
在给出用户登录名或数值用户ID后,这两个函数就能查看相关项. #include <sys/types.h> #include <pwd.h> struct passwd *ge ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- C Primer Plus 学习笔记 -- 前六章
记录自己学习C Primer Plus的学习笔记 第一章 C语言高效在于C语言通常是汇编语言才具有的微调控能力设计的一系列内部指令 C不是面向对象编程 编译器把源代码转化成中间代码,链接器把中间代码和 ...
- o'Reill的SVG精髓(第二版)学习笔记——第六章
第六章:坐标系统变换 想要旋转.缩放或者移动图片到新的位置.可以给对应的SVG元素添加transform属性. 6.1 translate变换 可以为<use>元素使用x和y属性,以在特性 ...
- 学习笔记 第六章 使用CSS美化图片
第六章 使用CSS美化图片 6.1 在网页中插入图片 GIF图像 跨平台能力,无兼容性问题: 具有减少颜色显示数目而极度压缩文件的能力,不会降低图像的品质(无损压缩): 支持背景透明功能,便于图像 ...
- Linux学习笔记(第六章)
第六章-档案权限与目录配置#chgrp:改变档案的所属群组#chown:改变档案的拥有者#chmod:改变档案的权限及属性 chown用法 chmod用法: r:4 w:2 x:1对于文档: 对于目录 ...
随机推荐
- 【bzoj5018】[Snoi2017]英雄联盟 背包dp
题目描述 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤!小皮球只会玩N个英雄,因此,他也只准 ...
- C#,一种简单的方式实现滚动鼠标缩放图片,平移
1.缩放 private void ImageShow_Load(object sender, EventArgs e) { pictureBox1.Load(@"E:\SQ1.jpg&qu ...
- 0-Android系统各层中LOG的使用
Android系统各层中LOG的使用 , ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ ANDROID_LOG_VERBOSE, ANDR ...
- html table 表格
前面的话 在CSS出现之前,table元素常常用来布局.这种做法在HTML4之后不再推荐使用.而现在有些矫枉过正,使用table展示数据都可能会被说不规范.本文将详细介绍HTML表格table tab ...
- linux私房菜-读书笔记
第零章:计算机概论 计算机:接受用户输入指令和数据,经过中央处理器的数据和逻辑单元运算处理器处理后,以产生或存储成有用的信息. 计算机硬件的五大单元:输入单元.输出单元.CPU内部控制单元.算术逻辑单 ...
- js计算数组中每个元素出现的次数
计算数组中每个元素出现的次数 var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; var countedNames = names.redu ...
- bitmap自己项目中处理遇到的问题
String path = "图片路径";Bitmap bitmap = BitmapFactory.decodeFile(path);安卓处理图片都是Bitmap,然后取到图片的 ...
- Axisfault faultcode:Server.userException异常
---恢复内容开始--- Axisfault faultcode:Server.userException异常 AxisFault faultCode: {http://schemas.xmlsoap ...
- Codeforces 746G(构造)
G. ...
- 如何在CentOS 7上安装Nginx
第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二步 - 安装Nginx现在Nginx存储 ...