登录账户记录和系统标识

    大多数 UNIX 系统都提供了两个数据文件:/var/run/utmp 文件记录当前登录到系统的各个用户,/var/log/wtmp 文件则跟踪各个登录和注销事件。每次写入这两个文件中的都是包含下列结构的一个二进制记录:
struct utmp{
    char ut_line[LEN];         // 终端线路:ttyh0、ttyd0、ttyp0 等
    char ut_name[LEN];         // 登录名
    long ut_time;            // 自 Epoch 以来经过的秒数
};

    登录时,login 程序填写此类型结构,然后将其写入到 utmp 文件和 wtmp 文件。注销时,init 进程将 utmp 文件中相应的记录擦除(每个字节都填以 null 字节),并将一个新纪录添写到 wtmp 文件。在 utmp 文件的注销记录中,ut_name 字段清除为 0。在系统再启动时,以及更改系统时间和日期的前后,都在 wtmp 文件中追加写特殊的记录项。who 命令读取的就是 utmp 文件,并以可读格式打印其内容;last 命令读取的则是 wtmp 文件的记录。
   
    POSIX.1 定义了 uname 函数,它返回与主机和操作系统有关的信息。
#include <sys/utsname.h>
int uname(struct utsname *name);    /* 返回值:若成功,返回非负值;否则,返回 -1 */

struct utsname{
    char sysname[LEN1];        // name of the operating system
    char nodename[LEN2];       // name of this node
    char release[LEN3];        // current release of operating system
    char version[LEN4];        // current version of this release
    char machine[LEN5];        // name of hardware type
    /* 可能有其它字段 */
};

    POSIX.1 只定义了 utsname 结构中最少需要提供的字段,且都为字符数组,每个数组的长度则由实现确定。该结构中的信息通常可用 uname 命令打印。
    历史上,BSD 派生的系统提供了 gethostname 函数,它只返回主机名,该名字通常就是 TCP/IP 网络上主机的名字。
#include <unistd.h>
int gethostname(char *name, int namelen);
                           /* 返回值:若成功,返回 0;否则,返回 -1 */

    namelen 参数指定 name 缓冲区长度,如若提供足够的空间,则通过 name 返回的字符串以 null 结尾;否则没有说明通过 name 返回的字符串是否以 null 结尾。POSIX.1 中规定它指定的最大主机名长度是 HOST_NAME_MAX。如果宿主机连接到 TCP/IP 网络中,则此主机名通常是该主机的完整域名。
    hostname 命令可用来获取和设置主机名(超级用户有一个类似的函数 sethostname 来设置主机名)。主机名通常在系统自举时设置,它由 /etc/rc 或 init 取自一个启动文件。

猜你喜欢

转载自aisxyz.iteye.com/blog/2389702