setpwent()用来将getpwent()的读写地址指回文件开头,即从头读取密码文件中的账号数据。
strcut passwd * getpwent(void);
getpwent()用来从密码文件(/etc/passwd)中读取一项用户数据,该用户的数据以passwd 结构返回。第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据,直到已无任何数据时返回NULL。
passwd 结构定义如下:
struct passwd{ char * pw_name; /*用户账号*/ char * pw_passwd; /*用户密码*/ uid_t pw_uid; /*用户识别码*/ gid_t pw_gid; /*组识别码*/ char * pw_gecos; /*用户全名*/ char * pw_dir; /*家目录*/ char * pw_shell; /* 所使用的shell路径*/ };
getpwent()在第一次调用时会打开密码文件,读取数据完毕后可使用endpwent()来关闭该密码文件。错误代码ENOMEM 内存不足,无法配置passwd结构。
endpwent()用来关闭由getpwent()所打开的密码文件。
示例代码:
#include <stdio.h> #include <stddef.h> #include <string.h> #include <pwd.h> char * getuidtoname(unsigned int uid) { struct passwd *ptr; setpwent();//将getpwent()的读写地址指回文件开头 while((ptr = getpwent()) != NULL)//读取一条记录放到ptr中 { if(uid == ptr->pw_uid) { break; } } endpwent();//用来关闭由getpwent()所打开的密码文件。 return ptr->pw_name; } char * getpwname_my(uid_t uid) { struct passwd *ptr; ptr = getpwuid(uid); return ptr->pw_name; } int main() { char * name; name = getuidtoname(1000); printf("name = %s ", name); name = getpwname_my(1000); printf("name = %s ", name); return 0; }
运行结果:
huangcheng@ubuntu:~$ ./a.out name = huangcheng name = huangcheng