APUE - 系统数据文件和信息

口令文件

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

在程序开始处调用 setpwent 是自我保护性的措施,以便在调用者在此之前已经调用 getpwent 打开了有关文件情况下,反绕有关文件使它们定位到文件开始处。getpwname 和 getpwuid 调用完成后不应使有关文件仍处于打开状态,所以应调用 endpwent 关闭它们。

阴影口令

#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
void setspent(void);
void endspent(void);

组文件

可以用下列两个由 POSIX.1 定义的函数来查看组名或数值组 ID。

#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);

下列三个函数用于查看整个组文件。

#include <grp.h>
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);

附加组 ID

#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);

#include <grp.h>        /* on Linux */
#include <unistd.h>     /* on FreeBSD, Mac OS X, and Solaris */
int setgroups(int ngroups, const gid_t grouplist[]);

#include <grp.h>        /* on Linux and Solaris */
#include <unistd.h>     /* on FreeBSD and Mac OS X */
int initgroups(const char *username, gid_t basegid);

系统标识

POSIX.1 定义了 uname 函数,它返回与当前主机和操作系统有关的信息。

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

struct utsname {
    char sysname[];     /* name of the operating system */
    char nodename[];    /* name of this node */
    char release[];     /* current release of operating system */
    char version[];     /* current version of this release */
    char machine[];     /* name of hardware type */
};

历史上,BSD 派生的系统提供了 gethostname 函数,它只返回主机名,该名字通常就是 TCP/IP 网络上主机的名字。

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

时间和日期例程

time 函数返回当前时间和日期。

#include <time.h>
time_t time(time_t *calptr);

与 time 函数相比,gettimeofday 提供了更高的分辨率(最高为微秒级)。

#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);

struct timeval {
    time_t  tv_sec;     /* seconds */
    long    tv_usec;    /* microseconds */
};

两个函数 localtime 和 gmtime 将日历时间转换成以年、月、日、时、分、秒、周日表示的时间,并将这些存放在一个 tm 结构中。

#include <time.h>
struct tm *localtime(const time_t *calptr);
struct tm *gmtime(const time_t *calptr);

struct tm {         /* a broken-down time */
    int tm_sec;     /* seconds after the minute: [0 - 60] */
    int tm_min;     /* minutes after the hour: [0 - 59] */
    int tm_hour;    /* hours after midnight: [0 - 23] */
    int tm_mday;    /* day of the month: [1 - 31] */
    int tm_mon;     /* months since January: [0 - 11] */
    int tm_year;    /* years since 1900 */
    int tm_wday;    /* days since Sunday: [0 - 6] */
    int tm_yday;    /* days since January 1: [0 - 365] */
    int tm_isdst;   /* daylight saving time flag: <0, 0, >0 */
};

localtime 和 gmtime 之间的区别是:localtime 将日历时间转换成本地时间(考虑到本地时区和夏时制标志),而 gmtime 则将日历时间转换成国际标准时间的年、月、日、时、分、秒、周日。

函数 mktime 以本地时间的年、月、日等作为参数,将其转换成 time_t 值。

#include <time.h>
time_t mktime(struct tm *tmptr);

asctime 和 ctime 函数产生时间日期字符串。

#include <time.h>
char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);

strftime 函数返回格式化的时间日期。

#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize,
                const char *restrict format,
                const struct tm *restrict tmptr);