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

#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

我在手册页上找不到任何与此相关的信息。我做错什么了吗?
提前谢谢!

最佳答案

返回值可能指向一个静态区域,该区域将被随后对getpwent()、getpwnam()或getpwuid()的调用覆盖。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam.html
尤其是,无法保证读/写的顺序,因此将从getpwnam返回的数据传递回getpwnam是不安全的。
你真的不应该使用getpwnam,而应该使用getpwnam_r

关于c - 为什么getpwnam()总是在函数中返回根信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12664456/

10-10 23:36