以下内容全部摘自UNIX环境高级编程(第3版)
口令文件
UNIX系统口令文件(POSIX.1则将其称为用户数据库)包含下图中所示的各字段,这些字段包含在<pwd.h>
中定义的passwd
结构中
POSIX.1定义了两个获取口令文件项的函数。在给出用户登录名或数值用户ID后,这两个函数就能查看相关项。
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwname(const char *name);
两个函数返回值:若成功,返回指针;若出错,返回NULL
这两个函数都返回一个指向passwd
结构的指针,passwd
结构通常是函数内部的静态变量,只要调用任一相关函数,其内容就会被重写。
getpwuid
函数有ls(1)程序使用,它将i节点中的数字用户ID映射为用户登录名。在键入登录名是,getpwnam
函数由login(1)程序使用。
如果要查看整个口令文件,下列3个函数则可用与此种目的。
#include <pwd.h>
struct passwd *getpwent(void);
返回值:若成功,返回指针;若出错或到达文件尾端,返回NULL
void setpwent(void);
void endpwent(void);
调用getpwent
时,它返回口令文件中的下一个记录项。在第一次调用该函数时,他打开它使用的各个文件。
函数setpwent
转回password database的开始,endpwent
则关闭这些文件。在使用getpwent
查看完口令文件后,
一定要调用endpwent
关闭这些文件。
阴影口令
加密口令存放在另一个通常称为阴影口令(shadow password)的文件中。该文件至少要包含用户名和加密口令。
与该口令相关的其他信息也可存放在该文件中。
在Linux3.2.0和Solaris 10中,与访问口令文件的一组函数相类似,有另一组函数可用于访问阴影口令文件。
#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
两个函数返回值:若成功,返回指针;若出错,返回值NULL
void setspent(void);
void endspent(void);
组文件
UNIX组文件(POSIX.1称其为组数据库)包含了下图所示字段。这些字段包含在
#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
两个函数返回值:若成功,返回指针;若出错,返回NULL
如同对口令文件进行操作的函数一样,这两个函数通常也返回一个静态变量的指针,在每次调用时都重写该静态变量。
如果需要搜索整个组文件,则需使用下列函数。
#include <grp.h>
struct group *getgrent(void);
返回值:若成功,返回指针;若出错或到达文件尾端,返回NULL
void setgrent(void);
void endgrent(void):
附属组ID
为了获取和设置附属组ID,提供了下列3个函数。
#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
返回值:若成功,返回附属组ID数量;若出错,返回-1
#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);
两个函数的返回值:若成功,返回0;若出错,返回-1
getgroups
将进程所属用户的各附属组ID填写到数组grouplist
中,填写入该数组的附属组ID数最多为gidsetsize
个。
实际填写到数组中的附属组ID数由函数返回。
作为一种特殊情况,如若gidsetsize
为0,则函数只返回附属组ID数,而对数组grouplist
则不做修改。(这使调用者
可以确定grouplist
数组的长度,以便进行分配。)
setgroups
可由超级用户调用以便为调用进程设置附属组ID表。grouplist
是组ID数组,而ngroups
说明了数组中的元素数。
ngroups
的值不能大于NGROUPS_MAX
其他数据文件
get
函数set
函数end
函数- 数据文件支持的某种形式的键搜索。
系统标识
POSIX.1定义了uname
函数,它返回与主机和操作系统有关的信息。
#include <sys/utsname.h>
int uname(struct utsname *name);
返回值:若成功,返回非负值;若出错,返回-1
struct utsname {
char sysname[]; /* name of the operating system */
char nodename[]; /* name of this node */
char release[]; /* current release of operating systm */
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);
返回值:若成功,返回0;若失败,返回-1
namelen
参数指定name
缓冲区长度,如若提供足够的空间,则通过name
返回的字符串以null字节结尾。
如若没有提供足够的空间,则不能明确是否字符串以null字节结尾。
时间和日期例程
由UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time, UTC)公元1970年1月1日00:00:00这一特定
时间以来经过的秒数。UNIX在这方面与其他操作系统的区别是:
1. 以协调统一时间而非本地时间计时
2. 可自动进行切换,如变换到夏令时
3. 将时间和日期作为一个量值保存
time
函数返回当前时间和日期
#include <time.h>
time_t time(time_t *calptr);
返回值:若成功,返回时间值;若出错,返回-1
时间值作为函数值返回。如果参数非空,则时间值也存放在由calptr
指向的单元内。
clock_gettime
函数可用于获取指定时钟的时间,返回的时间在timespec
结构中,它把时间表示为秒和纳秒
#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);
返回值:若成功,返回0;若失败,返回-1
当时钟ID设置为CLOCK_REALTIME
时,clock_gettime
函数提供了与time
函数类似的功能,不过在系统支持
高精度时间值的情况下,clock_gettime
可能比time
函数得到更高精度的时间值。