1

getpwnam()ユーザー名を呼び出し、そのユーザー名を関数に渡し、再度呼び出す簡単なプログラムを作成しgetpwnam()ました。何らかの理由で、常に関数内の root の 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

これに関連するマニュアルページには何も見つかりません。私が間違っていることはありますか?

前もって感謝します!

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 に答える