Почему getpwnam() всегда возвращает корневую информацию в функции?

Я написал простую программу, которая вызывает getpwnam() на имя пользователя, передает это имя пользователя в функцию, а затем вызывает getpwnam() снова. По какой-то причине я всегда получаю информацию о passwd для 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

Я не могу найти что-либо на странице руководства, связанной с этим. Я что-то не так делаю?

Заранее спасибо!

1 ответ

Решение

Возвращаемое значение может указывать на статическую область, которая перезаписывается последующим вызовом getpwent(), getpwnam() или getpwuid ().

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

В частности, нет никакой гарантии относительно порядка чтения / записи, поэтому небезопасно передавать данные, возвращенные из getpwnam вернуться к getpwnam,

Вы действительно не должны использовать getpwnam совсем; использование getpwnam_r вместо.

Другие вопросы по тегам