当前位置: 代码迷 >> 综合 >> 不可重入函数getpwnam的问题
  详细解决方案

不可重入函数getpwnam的问题

热度:64   发布时间:2024-01-22 04:29:49.0

  getpwnam()

  函数功能:获取用户登陆相关信息

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <pwd.h>

void sig_handler(int signo);

int main(int argc, char** argv)
{
        int                             ret;
       
        struct passwd*                  ptr;
        signal(SIGALRM, sig_handler);
        alarm(1);
        for(; ;){
                ptr = getpwnam("xxxx");
                if(ptr == NULL){
                        perror("getpwnam");
                        exit(1);
                }
                if(strcmp(ptr->pw_name, "xxxx") != 0){
                        printf("return value has corrupted by sig_handler, pw_name = %s\n", ptr->pw_name);
                }
        }

        exit(0);
}

void sig_handler(int signo)
{
        struct passwd*                  root_ptr;

        printf("in sig_handler\n");
        root_ptr = getpwnam("root");
        if(root_ptr == NULL){
                perror("sig_usr getpwnam");
                exit(2);
        }
        printf("pw_name = %s\n", root_ptr->pw_name);
        alarm(1);
}

 

getpwnam函数自己申请一个passwd结构的变量,然后只要在同一个进程中的任何地方和时间执行的时候都将得到的口令文件信息存放在这个结构中然后返回这个passwd结构的地址,所以虽然在main中和sig_handler中定义不同的指针变量,但其实它们都是指向getpwnam申请的passwd结构的地址。

 

 

 

 

 

  相关解决方案