6、其他系统数据文件

(本节对应原书的第6、7两节)

前面只说了两种数据文件,不同系统的密码文件,以及密码加密文件,其名称和位置可能会有所不同,具体参见参考资料。

实际上还有许多其他的数据文件,例如 /etc/services , /etc/protocols , /etc/networks 等。

所幸访问这些文件都有和前面的 passwd 等文件有类似的接口函数,这些函数分别是:

  • 一个 get 函数用来获取下一条记录,如果必要的话会打开文件。这些函数一般会返回一个指向结构的指针。如果到达了文件的结尾,那么大多数函数会返回 null .大多数的 get 函数返回一个指向静态结构的指针,所以如果我们要保存其值,我们需要自己拷贝一份。
  • 一个 set 函数,如果文件没有打开,那么这个函数会首先打开文件。这个函数会对文件进行 rewinds .这个函数在我们想要从头遍历文件的时候会被使用到。
  • 一个 end 函数,这个函数用来关闭文件。如同我们前面提到的那要,我们经常需要在访问之后调用这个函数来关闭所有的文件。

译者注

原文参考

参考: APUE2/ch06lev1sec6.html

参考: APUE2/ch06lev1sec7.html

7、登录登记

大多数 unix 系统都提供了两个文件: utmpwtmputmp 只记录当前登录的所有用户, wtmp 记录所有的登录和登出记录。两者中的数据是用" struct utmp "类型的结构变量保存的。

在登录的时候, login 程序会向 utmp 写入一个用 struct utmp 结构表示的数据项。

在登出的时候, utmp 相应数据项会被 init 清空为 null 比特;然后一个新的条目会被追加到 wtmp 文件中, wtmplogout 相关条目中的 ut_name 会自动变成零。

特定的条目会被追加到 wtmp 文件中用来标记系统什么时候重启,以及系统时间变化的前后(???什么意思???)。 who 命令会读取 utmp 文件,并且打印这个文件的内容。稍后版本的 UNIX 系统提供了 last 命令,这个命令会读取 wtmp 文件,并且打印选定的条目的相关信息。

solarisutmpx(4) man 手册给出了记录格式的描述信息, FreeBSD 5.2.1 , Linux 2.4.22 , 和 Mac OS X 10.3 的记录格式描述信息在 man 手册 utmp(5) 中。

译者注

原文参考

参考: APUE2/ch06lev1sec8.html

8、系统信息

获取当前主机和操作系统信息的函数:

#include <sys/utsname.h>
int uname(struct utsname *name);

这个函数会返回一个结构,我们也可以通过命令uname来获得这个结构的信息。成功返回0,失败返回1(实际值一般为-1)。

获取主机名称的信息,由于历史原因在BSD系列中有所提供,现在被放入了POSIX.1中:

#include <unistd.h>
int gethostname(char *name, int namelen);

成功返回0,失败返回1(实际值一般为-1)。

namelen指定name缓存的长度,如果长度足够,那么字符串以NULL结束,否则字符串是否以NULL结束是没有定义的。

有一个hostname命令,用来设置和获取主机名称信息(主机名称的设置需要用超级用户,函数是类似sethostname之类的),主机名称一般是在系统启动脚本中被设置的。

译者注

原文参考

参考: APUE2/ch06lev1sec9.html