Linux对每一个用户都提供了一个uid,我们从uid开始来说说用户信息。
uid有自己的类型,uid_t,它定义在头文件sys/types.h中。它通常是一个小整数。有些UID是系统预定义的,其他的则是系统管理员
在添加心用户时创建的,一般情况下,uid都大于100。
#include<sys/types.h>
#include<unistd.h>
uid_t getuid(void);
char *getlogin(void);
getuid函数返回程序关联的UID,它通常是启动程序的用户的UID。
getlogin函数返回当前用户关联的登录名。
系统文件/etc/passwd包涵一个用户账号数据库。它由行组成,每行对应一个用户,包括用户名,加密口令,用户标识符,组标识符,全名,家目录和
默认的shell.
人们定义了一组函数来提供一个标准而又有效的获取用户信息的编程接口。
#include<sys/types.h>
#include<pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
密码数据库结构passwd定义在头文件pwd.h中,它包括下面几个成员。
passwd成员 说明
char *pw_name 用户登录名
uid_t pw_uid UID号
gid_t pw_gid GID号
char *pw_dir 用户家目录
char *pw_gecos 用户全名
char *pw_shell 用户默认shell
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
uid_t uid;
gid_t gid;
struct passwd *pw;
uid = getuid();
gid = getgid();
printf("User is %s\n", getlogin());
printf("User IDs: uid=%d, gid=%d\n", uid, gid);
pw = getpwuid(uid);
printf("UID passwd entry:\n name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",
pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);
pw = getpwnam("root");
printf("root passwd entry:\n");
printf("name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",
pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);
exit(0);
}
如果要扫描密码文件中的所有信息,你可以使用getpwent函数。它的作用是依次取出文件数据项。
#include<pwd.h>
#include<sys/types.h>
void endpwent(void);
struct passwd *getpwent(void);
void setpwent(void);
getpwent函数依次返回用户的信息数据项。当到达文件尾是,它返回一个空指针。如果已经扫描了足够多的数据项,你可以使用endpwent函数来终止
处理过程。setpwent函数重置读指针到密码文件的开始位置。这样下一个getpwent调用将开始一个新的扫描。
用户和组标识还可以被其他一些不太常用的函数获得。
#include<sys/types.h>
#include<unistd.h>
uid_t getuid(uid);
gid_t getgid(void);
int setuid(uid_t uid);
int getgid(gid_t gid);
上述函数只有在超级用户下才可以使用。