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