不可重入函数getpwnam的问题

  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结构的地址。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值