UNIX系统高级编程——第六章-系统数据文件和信息-总结
口令文件:
/* The passwd structure. */
struct passwd
{
char *pw_name; /* Username. */
char *pw_passwd; /* Password. */
__uid_t pw_uid; /* User ID. */
__gid_t pw_gid; /* Group ID. */
char *pw_gecos; /* Real name. */
char *pw_dir; /* Home directory. */
char *pw_shell; /* Shell program. */
};
定义于pwd.h
相应的数据以ASSIC文本形式存在于/etc/passed文件中
每一行包含一个结构体中指示的7个字段,以冒号隔开
Password字段是经过单项加密的字符串,但是在使用阴影文件时是无意义字符
通常有root用户和nobody用户。root用户的用户ID和组ID都是0,表示超级用户。nobody用户的用户ID和组ID都是65534,表示没有优先权,并且没有密码,提供大家都可读写的文件
pw_gecos表示附加信息,其中的内容以逗号隔开,其中如果使用&符号表示替换为登录名
查看单个口令函数:
sys/types.h;pwd.h
struct passwd *getpwuid(uid_t uid)
struct passwd *getpwnam(const char *name)
成功返回指针,出错返回NULL
getpwuid函数由ls(1)程序调用,通过i节点中的数值用户ID获取其对应的passwd结构
getpwnam函数在输入登录名的时候由login(1)程序调用,通过用户名获取对应的passwd结构
两个函数返回指针对应的结构存储在静态区,每次调用都会重写该区域的内容
查看整个口令文件函数:
sys/types.h;pwd.h
struct passed *getpwent(void)/* 成功返回值真,出错或达到文件尾返回NULL */
void setpwent(void)
void endpwent(void)
getpwent获取口令文件中的下一条记录,每次调用都存储在相同的静态区并替换上一次调用的结果
setpwent重置获取开始的位置到文件起始,通常会在程序开始的地方调用setpwent以起保护作用
endpwent关闭文件,在使用getpwent结束后必须使用此函数关闭文件
阴影口令:
为了增加获取到原始加密口令,某些系统会将至少用户名和加密口令等信息存放到阴影口令文件中而不是口令文件中,系统通常要求用户每隔一段时间修改口令,该时间间隔也会存放到阴影口令文件中
SVR4:/etc/shadow;4.3+BSD:/etc/master.passwd
组文件:
struct group
{
char *gr_name; /* Group name. */
char *gr_passwd; /* Password. */
__gid_t gr_gid; /* Group ID. */
char **gr_mem; /* Member list. */
};
定义于grp.h文件
组文件存在于/etc/group
查看一条组文件函数:
sys/types.h;grp.h
struct group *getgrgid(gid_t gid)
struct *getgrnam(const char *name)
成功返回指针,出错返回NULL
和口令文件类似,返回的指针指向静态区的地址,每次调用都会覆盖上次调用产生的内容
查看整个组文件函数:
sys/types.h;grp.h
struct group *getgrent(void)
void setgrent(void)
void endgrent(void)
添加组ID:
文件存取权限检查不仅检查进程的有效组ID还检查添加组ID。因为一个用户经常参加多个项目,所以理应同时属于多个组
存取和设置添加组ID的函数:
sys/types.h;unistd.h
int getgroups(int gidsetsize,gid_t grouplist[])/* 成功返回添加组ID个数,出错返回-1 */
int setgroups(int ngroups,const gid_t grouplist[])/* 成功返回0,出错返回-1 */
int initgroups(const char *username,gid_t basegid)/* 成功返回0,出错返回-1 */
getgroups函数获取进程所属用户的各添加组ID并放到数组grouplist中,groupsize指定了可以放到grouplist中的最多个数,如果进程的实际添加组ID数大于groupsize而且groupsize非0,就会出错。没有明确说明有效组ID是否包含在返回列表中
特别的,如果groupsize为0,那么函数将返回进程的添加组ID数但是不将内容放到grouplist中
setgroups设置进程的添加组ID,grouplist是需要设置的添加组ID列表,ngroups说明数组中的元素个数。此函数需要超级用户权限,通常只有initgroups函数调用此函数,所以initgroups函数也需要超级用户权限
initgroups函数,读取整个组文件,根据username确定其组成员关系,调用setgroups函数为用户初始化添加组ID表。basegid是额外添加的组ID。此函数只有少数程序调用,比如login(1)在用户登录时调用
其他数据文件:
其他数据文件的处理都和上面描述的口令文件和组文件类似
一般数据文件都至少有三个函数:
• get函数:获取下一条记录,通常返回指向存储在静态存储区结构的指针,下一次调用将覆盖
• set函数:将get的获取位置重置到文件起始位置
• end函数:关闭文件
登录会计:
utmp文件:记录当前登录进系统的各个用户
wtmp文件:跟踪各个登录和注销事件
有如下结构:
struct utmp {
char ut_line[]; /* tty line: "ttyh0", "ttyd0", "ttyp0", ... */
char ut_name[]; /* login name */
long ut_time; /* seconds since Epoch */
} ;
登录时login程序会填写这样一个结构然后写入到utmp文件中,同时写入wtmp文件中。注销时,init程序将utmp文件中对应的记录清零(字节填0),并将一个新的记录填入wtmp文件中
大多数UNIX版本提供utmp和wtmp文件,但是相应的utmp结构体变得更加复杂
系统标识:
sys/utsname.h
int uname(struct utsname *name)
函数返回主机和操作系统相关的信息
函数参数是一个utsname结构的地址,函数会向这个地址中填写内容
时间和日期例程:
UNIX内核提供的时间服务提供的是时间戳的形式,并以time_t格式存储。函数为:
time.h
time_t time(time_t *calptr)
函数返回时间值,如果参数非NULL,也会将时间值存放到calptr指向的存储空间中
之后其他的函数会将时间戳转化为可读的形式
/* ISO C `broken-down time' structure. */
struct tm
{
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
};
localtime和gmtime函数:
区别是localtime将时间戳转化为本地时间,gmtime将时间戳转化为国际标准时间
mktime将tm结构体转化为时间戳
asctime和ctime将产生26字节字符串
strftime函数可以格式化输出自定义的时间格式
UNIX系统高级编程——第六章-系统数据文件和信息-总结的更多相关文章
- UNIX环境高级编程 第6章 系统数据文件和信息
UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...
- unix环境高级编程第六章笔记
口令文件 阴影口令 组文件 附属组ID 登录账户记录 系统标识 口令文件<\h2> /etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登录时校验用户的口令,文件中每行的 ...
- UNIX系统高级编程——第四章-文件和目录-总结
文件系统: 以UNIX系统V文件系统为例: 磁盘分为区,每个分区都有自己的文件系统: i节点是固定长度的记录项,包含了文件的相关信息.目录项包含文件名和i节点号.stat结构中除文件名和i节点编号 ...
- UNIX系统高级编程——第五章-标准I/O库-总结
基础: 标准I/O库在ANSI C中定义,可移植在不同的系统 文件指针(FILE):标准I/O库操作的不是文件描述符,而是流.FILE文件指针包含的是维护流所需的信息 通过函数fileno获取流的文件 ...
- UNIX环境高级编程 第13章 守护进程
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...
- UNIX环境高级编程 第5章 标准I/O库
本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...
- UNIX环境高级编程 第1章 UNIX基础知识
所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- UNIX环境高级编程 第7章 进程环境
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...
随机推荐
- Django框架详解之template
模板简介 将页面的设计和python的代码分离开会更干净简洁更容易维护.我们可以使用Django的模板系统来实现这种模式 python的模板:HTML代码+模板语法 模板包括在使用时会被值替换掉的变量 ...
- Pyhton学习——Day26
#多态:多态指的是一类事物有多种形态# import abc# class Animal(metaclass = abc.ABCMeta):# 同一类事物:动物# @abc.abstractclass ...
- v-model指令后面跟的参数(number、lazy、debounce)
1. number 想将用户的输入自动转换为Number类型(如果原值的转换结果为NaN, 则返回原值) 2. lazy 在默认情况下, v-model在input事件中同步输入框的值和数据, 我们可 ...
- Shell(五)Shell输入/输出重定向
Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...
- [luogu] P4155 [SCOI2015]国旗计划(贪心)
P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...
- 多个 WindowsFormsHost 叠加顺序调整
原文:多个 WindowsFormsHost 叠加顺序调整 工作中遇到多个 WindowsFormsHost 包装的控件叠加顺序的调整问题,用了 BingToFront 和 BringToBack,不 ...
- Maven学习总结(23)——Maven常用命令介绍
1.生成eclipse项目:mvn eclipse:eclipse 2.清除eclipse的一些系统设置:mvn eclipse:clean 3.mvn tomcat:run 在tomcat里面运行 ...
- Nginx +Tomcat 实现动静态分离(转)
Nginx +Tomcat 实现动静态分离 动静态分离就是Nginx处理客户端的请求的静态页面(html页面)或者图片,Tomcat处理客户端请求的动态页面(jsp页面),因为Nginx处理的静态页面 ...
- mybatis批量插入oracle大量数据记录性能问题解决
环境: mybatis + oracle11g r2 1.使用"直接路径插入"(以下sql语句中的"/*+append_values */"),而且使用key ...
- STM32IAP升级-----编写IAP升级遇到的问题总结
IAP的源代码等资料我上传了,压缩包内有12个文件.,http://download.csdn.net/detail/f907279313/7524849(要积分的辛苦收集的你们就给点积分吧) 还有还 ...