web-dev-qa-db-ja.com

LinuxのC / C ++でユーザー名を取得する方法は?

プログラムで環境(getenv、...)を使用せずに実際の「ユーザー名」を取得するにはどうすればよいですか?

18
Zat42

関数getlogin_r()で定義されたunistd.hはユーザー名を返します。見る man getlogin_r 詳細については。

その署名は次のとおりです。

int getlogin_r(char *buf, size_t bufsize);

言うまでもなく、この関数はCまたはC++で簡単に呼び出すことができます。

47
drrlvn

http://www.unix.com/programming/21041-getting-username-c-program-unix.html から:

/* whoami.c */
#define _PROGRAM_NAME "whoami"
#include <stdlib.h>
#include <pwd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  register struct passwd *pw;
  register uid_t uid;
  int c;

  uid = geteuid ();
  pw = getpwuid (uid);
  if (pw)
    {
      puts (pw->pw_name);
      exit (EXIT_SUCCESS);
    }
  fprintf (stderr,"%s: cannot find username for UID %u\n",
       _PROGRAM_NAME, (unsigned) uid);
  exit (EXIT_FAILURE);

}

メインラインを取り、クラスにカプセル化します:

class Env{
    public:
    static std::string getUserName()
    {
        uid_t uid = geteuid ();
        struct passwd *pw = getpwuid (uid);
        if (pw)
        {
            return std::string(pw->pw_name);
        }
        return {};
    }
};

Cのみ:

const char *getUserName()
{
  uid_t uid = geteuid();
  struct passwd *pw = getpwuid(uid);
  if (pw)
  {
    return pw->pw_name;
  }

  return "";
}
37
Nemanja Boric