如何在 Linux 中使用 C/C++ 获取用户名?
- 2024-11-13 08:36:00
- admin 原创
- 17
问题描述:
如何在不使用getenv
程序中的环境(,...)的情况下获取实际的“用户名”?环境是 Linux 上的 C/C++。
解决方案 1:
getlogin_r()
中定义的函数unistd.h
返回用户名。请参阅man getlogin_r
以了解更多信息。
其签名为:
int getlogin_r(char *buf, size_t bufsize);
不用说,这个函数可以在 C 或 C++ 中轻松调用。
解决方案 2:
来自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
",
_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 "";
}
解决方案 3:
#include <iostream>
#include <unistd.h>
int main()
{
std::string Username = getlogin();
std::cout << Username << std::endl;
return 0 ;
}
另一种方法是这样的 -
#include <iostream>
using namespace std;
int main()
{
cout << system("whoami");
}
解决方案 4:
使用char *cuserid(char *s)
在 中找到的stdio.h
。
#include <stdio.h>
#define MAX_USERID_LENGTH 32
int main()
{
char username[MAX_USERID_LENGTH];
cuserid(username);
printf("%s
", username);
return 0;
}
更多详细信息请参阅:
解决方案 5:
通过现代 c++ 规范进行一些工作
static auto whoAmI = [](){ struct passwd *tmp = getpwuid (geteuid ());
return tmp ? tmp->pw_name : "onlyGodKnows";
}
解决方案 6:
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
// Return username or nullptr if unknown.
const char* username() {
const passwd* pw = getpwuid(geteuid());
return pw == nullptr ? nullptr : pw->pw_name;
}
解决方案 7:
今天我不得不做同样的事情,但不想包含任何特定于操作系统的标头。因此,您可以以跨平台的方式执行以下操作,而无需诉诸任何特定于 Linux/Windows 的标头:
#include <stdio.h>
#include <memory>
#include <stdexcept>
#include <array>
#include <regex>
std::string execute_command(std::string cmd)
{
std::array<char, 128> buffer;
std::string result;
#if defined(_WIN32)
#define POPEN _popen
#define PCLOSE _pclose
#elif defined(unix) || defined(__unix__) || defined(__unix)
#define POPEN popen
#define PCLOSE pclose
#endif
std::unique_ptr<FILE, decltype(&PCLOSE)> pipe(POPEN(cmd.c_str(), "r"), PCLOSE);
if (!pipe)
{
throw std::runtime_error("popen() failed!");
}
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
{
result += buffer.data();
}
return result;
}
std::string get_current_username()
{
#if defined(_WIN32)
// whoami works on windows as well but it returns the name
// in the format of `computer_name/user_name` so instead
// we use %USERNAME% which gives us the exact username.
#define USERNAME_QUERY "echo %USERNAME%"
#elif defined(unix) || defined(__unix__) || defined(__unix)
#define USERNAME_QUERY "whoami"
#endif
auto username = execute_command(USERNAME_QUERY);
// this line removes the white spaces (such as newline, etc)
// from the username.
username = std::regex_replace(username, std::regex("\\s"), "");
return username;
}
这在 Linux 和 Windows 上都可以很好地运行,并且与 C++11 兼容!
在线测试:https ://paiza.io/projects/e/xmBuf3rD7MhYca02v5V2dw?theme=twilight
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD