【库函数】linux之getuid和getpwuid函数

来源:互联网 发布:淘宝官方集运 费用 编辑:程序博客网 时间:2024/05/16 08:57

1、getuid和getpwuid函数简介

      (一)

       (1)头文件

                   #include<sys/types.h>
                  #include<unistd.h>
        (2)函数原型
                  uid_t getuid(void);

       (3)说明

               uid_t是定义在头文件sys/types.h中,它通常是一个小整形。函数返回一个调用程序的真实用户ID,一般来说,这个函数都是会调用成功的。

       (二)

         (1)头文件

#include <sys/types.h>
#include <pwd.h>
 
          (2)函数原型
struct passwd *getpwuid(uid_t uid);
 
           (3)函数说明
getpwuid函数是通过用户的uid查找用户的passwd数据。如果出错时,它们都返回一个空指针并设置errno的值,用户可以根据perror函数查看出错的信息。
The passwd structure isdefined in<pwd.h> as follows:
struct passwd {
char*pw_name;                 /*用户名*/
char*pw_passwd;            /*用户密码*/
uid_t pw_uid;                    /*用户id*/
gid_t pw_gid;                   /*组id*/
char*pw_gecos;              /*真实名称*/
char*pw_dir;                     /*当前路径*/
char*pw_shell;                /*使用的shell*/
};

 

2、举例:

 #include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
 uid_t uid;
 uid = getuid();
 printf("User IDs: uid=%d\n", uid);
 
 uid_t my_uid;
 struct passwd *my_info;
 my_info =getpwuid( getuid() );
 printf( "my name = [%s]\n", my_info->pw_name );
 printf( "my passwd = [%s]\n", my_info->pw_passwd );
 printf( "my uid = [%d]\n", my_info->pw_uid );
 printf( "my gid = [%d]\n", my_info->pw_gid );
 printf( "my gecos = [%s]\n", my_info->pw_gecos );
 printf( "my dir = [%s]\n", my_info->pw_dir );
 printf( "my shell = [%s]\n", my_info->pw_shell );
 return 0;
}

结果:

User IDs: uid=501
my name = [mister]
my passwd = [x]
my uid = [501]
my gid = [100]
my gecos = []
my dir = [/home/mister]
my shell = [/bin/bash]

3、小结

从函数中可以看到先用getuid获取到用户id号,然后使用getpwuid获取到了用户的相关信息。

这个函数实现的机制其实就是跟/etc/passwd的文件中记录的信息一样,cat /etc/passwd如下:

pulse:x:495:491:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
stap-server:x:155:155:Systemtap Compile Server:/var/lib/stap-server:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/bin/sh
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
winter:x:500:500::/home/winter:/bin/bash
mister:x:501:100::/home/mister:/bin/bash

结构体passwd和这个文件中是一一对应的。实际上这个函数实现的就是获取passwd文件中的信息。可以知道当前程序正在使用的用户以及用户路径。