为什么getpwnam()总是在函数中返回根信息?

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

 #include  #include  #include  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返回的数据传递回getpwnamgetpwnam

你根本不应该使用getpwnam ; 请改用getpwnam_r