6.1 引言

UNIX系统的正常运行需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件。用户每次登陆UNIX系统,以及每次执行ls -l命令是都要使用口令文件。
对于这些数据文件的可移植接口是本章的主题。本章包括了系统标示函数、时间、日期函数。

6.2 口令文件(Password File)

给出用户登录名或数值用户ID后,这两个用户就可以查看相关项
#Include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);

getpwuid函数由ls(1)程序使用,在输入登录名是,getpwnam函数由login(1)程序使用

下列函数可以用来查看整个口令文件
#include<pwd.h>
struct passwdd *getpwent(void);
void setpwent(void);
void endpwent(void);

调用getpwent时,它返回口令文件中的下一个纪录项

函数setpwent反绕它所使用的文件,endpwent则关闭这些文件。
使用getpwent查看完口令文件后,一定要调用endpwent关闭这些文件

getpwnam函数的一个实现
#include <pwd.h>
#include <stddef.h>
#include <string.h>
struct passwd *getpwnam(const char *name)
{struct passwd *ptr;setpwent();whlie((ptr = getpwent())!=NULL)if(strcmp(name,ptr->pw_name)==0)break;endpwent(); return(ptr);
}

setpwent反绕有关文件使它们定位到文件开始处(自我保护措施)。getpwnam和getpwuid完成后不应使文件处于打开状态,所以调用endpwent关闭它们。

6.3 阴影口令(Shadow Passwords)

某些系统讲加密口令存放在另一个通常称为阴影口令的文件中。该文件至少包含用户名和加密口令。与该口令相关的其他信息也可以存放在该文件中。
阴影口令文件不应是一般用户可以读取的。仅有少数几个程序需要访问加密口令,如login(1)和passwd(1)。有了阴影口令普通口令文件/etc/passwd可以让用户自由读取了
有另一组函数可用于访问阴影口令文件
#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
void setpent(void);
void endspent(void);

6.4 组文件

用下列函数来查看组名或数值组ID
#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *gergrnam(const char *name);

如同对口令文件进行操作的函数一样

如果需要搜索整个组文件,则必须使用另外几个函数
#include <grp.h>
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);

6.5 附属组ID

6.6 实现区别

6.7 其他数据文件

至此讨论了两个系统数据文件-口令文件和组文件。UNIX系统还使用很多其他文件。例如,网络服务器所提供服务的数据文件(/etc/services),记录协议信息的数据文件(/etc/protocols),这写数据文件的接口都与上述对口令文件的组文件的相似
分别是get函数(读下一个记录),set函数(反绕该文件,希望在相应文件起始处开始处理),end函数(关闭相应数据文件)

6.8 登录账户记录

utmp文件记录当前登录到系统的各个用户;wtmp文件跟踪各个登陆和注销事件

6.9 系统标识

uname函数返回与主机和操作系统有关的信息
#include <sys/utname.h>
int uname (struct utsname *name);

utsname的结构

6.10 时间和日期例程(Time and Date Routines)

time函数返回当前时间和日期
#include <time.h>
time_t time(time_t *calptr);

clock_gettime函数可用于获取指定时钟的时间,把时间保存再timespec结构中

#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);

当时钟ID设置为CLOCK_REALTIME时,clock_gettinng函数提供了与time函数类似的功能,clock_getting可能比time函数提供更高的精度的时间

#include<sys/time.h>
int clock_getres(clockid_t clock_id, struct timespec *tsp);

clock_getres函数把参数tsp指向的timespec结构初始化为与clock_id参数相对应的时钟精度

对特定的时钟设置时间

#include<sys/time.h>
int clock_settime(clockid_t clock_id, const struct timespec *tsp);
#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);

两个函数localtime 和gmtime将日历时间转化成分解的时间,并将其存放再一个tm结构中


localtime和gmtime之间的区别是:localtime将日历时间转换成本地时间(考虑到本地时区和夏令时标志),而gmtime则将日历时间转化成协调统一时间的。
函数mktime以本地时间的年,月,日等作为菜蔬,将其变成time_t值
#include<time.h>
time_t mktime(struct tm *tmptr);

函数strftime是一个类似printf的时间值函数,可以通过可用的多个参数指定产生的字符串。

#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);

ISO C规定的转换说明(conversion specifiers)


strptime函数是strftime的反过来的版本,把字符串转化成分解的时间

6.11 小结

所有UNIX系统都使用口令文件和组文件。介绍了阴影口令,以及它可以增强系统的安全性附属组ID提供了一个用户同事可以参加多个组的方法。还介绍了大多数系统提供的访问其他与系统有关数据文件的类似函数。讨论一个POSIX.1的系统标识函数,应用程序使用他们以标识它再何种系统上运行。最后说一下与时间和日期有关的一些函数

UNIX环境高级编程之第6章:系统数据文件和信息相关推荐

  1. UNIX环境高级编程之第4章:文件和文件夹-习题

    4.1 stat函数是尾随符号链接的,所以用stat替换lstat不会显示符号链接的信息 4.2 在一个目录下先再shell中输入umask shell进程再进行创建文件的操作.其权限抖都会被屏蔽 4 ...

  2. unix环境高级编程之 read与write 函数详解

    学习记录:unix环境高级编程之 read 与write  函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...

  3. APUE第6章 系统数据文件和信息

    6.1 引言 UNIX系统的正常运作需要使用大量与系统有关的数据文件,例 如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁 使用的两个文件.用户每次登录UNIX系统 ...

  4. 第6章 系统数据文件和信息

    口令文件 用户: 基础密码文件:/etc/passwd 密码文件:/etc/shadow 组: 基础密码文件:/etc/group 密码文件:/etc/gshadow /etc/passwd 内容:用 ...

  5. 第6章系统数据文件和信息总结

    1 口令文件的shell字段 如果是空,则使用系统默认的shell,一般是/bin/sh /dev/null:阻止对应的用户名登陆系统 /bin/false:同样是阻止特定用户登录,以不成功状态终止 ...

  6. UNIX环境高级编程源码

    UNIX环境高级编程源码 一.下载源码 利用wget命令下载源码,源码地址http://apuebook.com/src.3e.tar.gz 可以在服务器的根目录下创建文件夹,mkdir 1.mkdi ...

  7. 《unix环境高级编程》笔记4——系统数据文件和信息

    文章目录 系统数据文件和信息 口令文件 获取口令文件 getwpuid getpwnam 阴影口令 组文件 附属组ID 查看附属组ID 其他文件 登录账户记录: 系统标识 uname gethostn ...

  8. Unix环境高级编程-系统数据文件和信息

    unix口令文件/etc/passwd 包含了下表所示的字段: 系统定义了两个获取口令文件项的函数,在给出用户登录名或数值用户ID后,这两个函数能够查看相关项. struct passwd *getp ...

  9. UNIX环境高级编程——系统数据文件和信息

    6.1 引言 UNIX系统的正常运行需要使用大量与系统有关的数据文件,这些文件都是ASCII文本文件,并且使用标准I/O库读这些文件. 6.2 口令文件 UNIX口令文件是/etc/passwd,每一 ...

  10. linux系统数据文件和信息--unix环境高级编程读书笔记

    linux系统中的数据文件有很多,在这一章里介绍的主要内容是和系统有关的一系列文件,包括passwd,shadow,group,utmp,wtmp以及一些系统的相关信息和时间的相关操作. 1.pass ...

最新文章

  1. 超级详细的 Python 数据分析指南
  2. 一个c/c++分布式框架ZMQ或者ZeroMQ, 介绍和win下安装使用方法
  3. JavaScript window.location物
  4. 通过js让页面中的元素上下居中的写法
  5. 天津大学计算机学院院长及副院长,李晓红 教授
  6. python中的面向对象
  7. Windows中命令提示符被禁用的解决方法
  8. HashSet、LinkedHashSet、TreeSet 简明解释
  9. HTTP 之 HTTPD介绍
  10. Google 开源 iOS 应用测试工具:EarlGrey
  11. unity3d ppsspp模拟器中的post processing shader在unity中使用
  12. 人工智能在生活中的应用都有哪些?
  13. 锋利的jQuery(汇总)
  14. [转载]MTK入门教程
  15. 面试必背 Java 多线程面试题
  16. 推荐一个项目管理工具:TAPD
  17. cad横断面图转文本
  18. HTML5+CSS3新特性
  19. WordPress 5.0的重要问题,答案已有
  20. Excel怎么在数据中间隔插入指定行

热门文章

  1. 简易新闻网站NewsWeb-网页抓取
  2. C#处理控制台关闭事件
  3. 努力奋斗,但不想像蚂蚁那样!
  4. 福大软工1816 - 第四次作业(团队展示)
  5. sqlserver字符串处理函数
  6. 图片延迟加载(lazyload)的实现原理
  7. MapReduce 学习4 ---- 自定义分区、自定义排序、自定义组分
  8. phpStorm使用技巧总结
  9. 如何设计自动化测试的代码结构
  10. EonerCMS——做一个仿桌面系统的CMS(十四)