UNIX环境高级编程——实现uid to name

       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




原文地址:https://www.cnblogs.com/wangfengju/p/6172499.html