简单实现getpwnam()

Posted 快第三个十年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单实现getpwnam()相关的知识,希望对你有一定的参考价值。

利用getpwent 、setpwent、endpwent来实现getpwnam的功能。

#include<pwd.h>

struct pwd *getpwnam(const char *name)   return pointers on success ,or NULL on error

getpwnam()通过输入的用户名来返回指向struct pwd结构的指针,struct pwd 结构内容与/etc/passwd的7项内容相对应。可以通过man getpwnam 来

具体查看struct pwd 中每一项的内容。

#include <pwd.h>

struct pwd *getpwent(void)   return pointers on success ,or NULL on end of stream or error

void setpwent(void);

void endpwent();

getpwent()函数一旦调用会自动打开密码文件(/etc/passwd),当密码文件处理完毕后,要使用endpwent()将其关闭。

在使用的过程中,调用setpwent()可以重新返回文件的起始处。

 1   1 #include "head.h"
 2   2
 3   3 
 4   4 struct passwd *getpwnam(const char *name)
 5   5 {
 6   6       struct passwd *ptr;
 7   7       //setpwent();  
 8   8       while((ptr = getpwent())!=NULL)
 9   9             if(strcmp(name,ptr->pw_name)==0)
10  10                      break;
11  11       endpwent();
12  12       return(ptr);
13  13 }
14  14 int main (int argc,char *argv[])
15  15 {
16  16         struct passwd *pwd;
17  17         char name[20]={"zhengyu"};
18  18         printf("enter the name which you want to find\n");
19  19         scanf("%s",name);
20  20         getchar();
21  21         pwd=getpwnam(name);
22  22         printf("user id is %d\n",pwd->pw_uid);
23  23         printf("user name is %s\n",pwd->pw_name);
24  24         printf("user group id is %d\n",pwd->pw_gid);
25  25         printf("user directory is %s\n",pwd->pw_dir);
26  26         printf("user login shell is %s\n",pwd->pw_shell);
27  27         return 0;
28  28 
29  29 }

head.h

  1 #include <sys/uio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <unistd.h>
  5 #include <stdlib.h>
  6 #include <stdio.h>
  7 #include <string.h>
  8 #include <fcntl.h>
  9 #include <errno.h>
 10 #include <setjmp.h>
 11 #include <pwd.h>
 12 #include <grp.h>
 13 #include <limits.h>
 14 #include <shadow.h>
                          

 

在使用此类返回NULL时不一定是出错的函数时,可以通过设置errno的值来使用。

1     errno=0;
2     if(pwd==NULL)       
3     {
4             if(errno==0)
5             printf("deal...");
6             else
7             perror("error");
8      }

 

以上是关于简单实现getpwnam()的主要内容,如果未能解决你的问题,请参考以下文章

getpwnam 中的内存泄漏是不是有修复或解决方法?

[emerg]: getpwnam(“nginx”) failed

启动Nginx报错nginx: [emerg] getpwnam(

nginx: [emerg] getpwnam(“www”) failed

nginx安装 nginx: [emerg] getpwnam(“www”) failed 错误

nginx: [emerg] getpwnam("www") failed