1

我编写了一个简单的程序,它调用getpwnam()一个用户名,将该用户名传递给一个函数,然后getpwnam()再次调用。出于某种原因,我总是在函数内部获取 root 的密码信息。

#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>

void printuser(char *username) {
  printf("USERNAME2: %s\n", username);
  struct passwd *user_info = getpwnam(username);
  printf("USERNAME3: %s\n", username);
  printf("USERNAME4: %s\n", user_info->pw_name);
}

int main(int argc, char *argv[]) {
  struct passwd *user_info = getpwnam(argv[1]);
  printf("USERNAME1: %s\n", user_info->pw_name);
  printuser(user_info->pw_name);
  printf("USERNAME5: %s\n", user_info->pw_name);
}

该程序总是产生以下输出:

$ ./test_getpwnam chenxiaolong
USERNAME1: chenxiaolong
USERNAME2: chenxiaolong
USERNAME3: root
USERNAME4: root
USERNAME5: root

我在手册页中找不到与此相关的任何内容。有什么我做错了吗?

提前致谢!

4

1 回答 1

3

返回值可能指向一个静态区域,该区域被后续调用 getpwent()、getpwnam() 或 getpwuid() 覆盖。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam.html

特别是,无法保证读/写的顺序,因此将返回的数据传递getpwnamgetpwnam.

你真的根本不应该使用getpwnam;改为使用getpwnam_r

于 2012-09-30T20:14:39.653 回答