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包含一个用户帐号数据库。包括用户、用户标识符(UID)、组标识符(GID)、全名、家目录和默认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
在某些系统(Linux)上是那个,用户全名是pw_gecos,而有些是pw_comment。
getpwuid和getpwnam函数都返回一个指针,该指针指向与某个用户对应的passwd结构。这个用户通过getpwuid的UID参数或通过getwnam的用户登录名参数来确定。出错时返回一个空指针并设置errno。
函数实例:
下面的程序getpwuid.c密码数据库中提取一些用户信息:
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
uid_t uid;
gid_t gid;
struct passwd *pwd;
uid = getuid();
gid = getgid();
pwd = getpwuid(uid);
printf("user is %s \n",getlogin());
printf("UID passwd entry:\n");
printf("%d,%d,%s,%s\n",pwd->pw_uid,pwd->pw_gid,pwd->pw_dir,pwd->pw_gecos,pwd->pw_shell);
pwd = getpwnam("root");
printf("root passwd entry :\n");
printf("%d,%d,%s,%s\n",pwd->pw_uid,pwd->pw_gid,pwd->pw_dir,pwd->pw_gecos,pwd->pw_shell);
return 0;
}
程序运行结果:
zhangxm@zhangxm:~/c_programmer/Linux环境/dir_getpwuid$ ./getpwuid
user is zhangxm
UID passwd entry:
1000,1000,/home/zhangxm,张先明,,,
root passwd entry :
0,0,/root,root
如果要扫描密码文件中的所有信息,你可以使用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 geteuid(void);
gid_t getgid(void);
gid_t getegid(void);
int setuid(uid_t uid);
int setgid(gid_t gid);