1、主要的系统数据
包括但不限于passwd(5), shadow(5), group(5), hosts(5), networks(5), protocols(5), services(5)等,它们的文档位于man手册的第5部分。它们均存于/etc目录下。Unix系统提供了相应的数据结构和函数对它们进行读取。但是这一块根据书中的表6-1可以看出,POSIX对此并没有作出特别具体的定义。对于Linux,可以参考LSB中的相关定义或查看当前系统中的man手册。
A.口令文件passwd
对于文件passwd(5),值得注意的一点是,如果里面注册的某个用户只打算用于守护进程之类而不打算给予登录shell,应将其home directory相应字段设置为/dev/null或者/bin/false等。
1 2 3 4 | #include <pwd.h> struct passwd *getpwuid(uid_t uid); struct passwd *getpwnam(const char *name); |
这两个函数分别通过UID和用户名取得其passwd结构。
1 2 3 4 5 | #include <pwd.h> struct passwd *getpwent(void); void setpwent(void); void endpwent(void); |
getpwent返回passwd(5)文件下一个记录项;
setpwent重置getpwent的当前位置到开始处;
endpwent关闭getpwent打开的文件(必须);
B.阴影口令文件shadow
管理shadow文件的相应API主要包括以下,用法类似passwd的函数:
1 2 3 4 5 6 | #include <shadow.h> struct spwd *getspnam(const char *name); struct spwd *getspent(void); void setspent(void) void endspent(void); |
C.组文件group
管理group(5)文件的相应API主要包括以下,用法也类似passwd的函数:
1 2 3 4 5 6 7 | #include <grp.h> struct group *getgrgid(gid_t gid); struct group *getgrnam(const char *name); struct group *getgrent(void); void setgrent(void); void endgrent(void); |
对于进程的附加组操作,还包括以下函数:
1 2 3 4 5 6 | #include <unistd.h> int getgroups(int gidsetsize, gid_t grouplist][); #include <grp.h> /* on Linux*/ int setgroups(int ngroups, const gid_t grouplist[]); int initgroups(const char *username, gid_t basegid); |
getgroups和setgroups用于读取/设置当前用户进程的附加组id,并返回实际读取/设置的附加组id数量;
initgroups初始化附加组id表,basegid为用户进程的主GID。
D.service(5)、networks(5)、protocols(5)等数据可通过getxxxbyxxx或getaddrinfo(3)等函数取得。具体见“第十六章 网络IPC”或Richard Stevens的《UNIX网络编程》第一卷;



