zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    关于C的一些理解
    Linux下/proc目录简介
    python学习链接
    “段寄存器”的故事[转](彻底搞清内存段/elf段/实模式保护模式以及段寄存器)
    内核态与用户态
    bzoj1087: [SCOI2005]互不侵犯King 状压dp
    bzoj1007: [HNOI2008]水平可见直线 单调栈维护凸壳
    bzoj1015: [JSOI2008]星球大战starwar
    bzoj1002: [FJOI2007]轮状病毒 生成树计数
    bzoj1013: [JSOI2008]球形空间产生器sphere
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172499.html
Copyright © 2011-2022 走看看