如何在Linux中获取C/C++中的用户名?

Zat*_*t42 20 c c++ linux posix username

如何在不使用程序中的环境(getenv,...)的情况下获取实际的"用户名"?

drr*_*lvn 48

getlogin_r()定义的函数unistd.h返回用户名.有关man getlogin_r更多信息,请参阅

它的签名是:

int getlogin_r(char *buf, size_t bufsize);
Run Code Online (Sandbox Code Playgroud)

不用说,这个函数可以很容易地在C或C++中调用.

  • 注意getlogin_r返回登录到进程控制终端的用户的名称.这可能与作业运行的用户不同.如果未连接到控制终端(例如,进程被守护进程),此功能也将失败. (8认同)
  • @ Armed9Gagger,在C++库中没有用于POSIX中定义的这些东西的API.C++被认为是*使用POSIX函数. (7认同)
  • 这需要TTY存在 - 如果您通过某种调度程序调度应用程序,这可能会失败..请参阅Nemanja Boric对更"强大"版本的回答 (3认同)

Nem*_*ric 40

来自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);

}
Run Code Online (Sandbox Code Playgroud)

只需占用主线并将其封装在类中:

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 {};
    }
};
Run Code Online (Sandbox Code Playgroud)

仅适用于C:

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

  return "";
}
Run Code Online (Sandbox Code Playgroud)

  • 有可能你不能使用C*标准库*,而不是*所有C函数*.您需要直接或间接使用C函数来执行任务. (5认同)