在Linux,C ++中获取主目录
我需要一种方法来获取运行在Linux上的C ++程序的用户主目录。 如果相同的代码在Unix上工作,这将是很好的。 我不想使用HOME环境值。
AFAIK,根主目录是/ root。 在这个目录中创build一些文件/文件夹,在我的程序由root用户运行的情况下可以吗?
您需要getuid
获取当前用户的用户getpwuid
,然后getpwuid
获取该用户的密码条目(包括主目录):
#include <unistd.h> #include <sys/types.h> #include <pwd.h> struct passwd *pw = getpwuid(getuid()); const char *homedir = pw->pw_dir;
注意:如果你在一个线程应用程序中需要这个,你会想要使用getpwuid_r
来代替。
您应该首先检查$HOME
环境variables,如果不存在,请使用getpwuid。
#include <unistd.h> #include <sys/types.h> #include <pwd.h> const char *homedir; if ((homedir = getenv("HOME")) == NULL) { homedir = getpwuid(getuid())->pw_dir; }
另外请注意,如果您希望主目录将configuration或caching数据存储为您编写的程序的一部分,并且要分发给用户,则应该考虑遵循XDG基本目录规范 。 例如,如果要为应用程序创buildconfiguration目录,则应首先使用getenv
检查$XDG_CONFIG_HOME
如上所示,如果未设置variables,则只返回上面的代码。
如果你需要multithreading的安全性,你应该使用getpwuid_r
而不是像这样的getpwuid
(从getpwnam(3)
手册页):
struct passwd pwd; struct passwd *result; char *buf; size_t bufsize; int s; bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); if (bufsize == -1) bufsize = 16384; buf = malloc(bufsize); if (buf == NULL) { perror("malloc"); exit(EXIT_FAILURE); } s = getpwuid_r(getuid(), &pwd, buf, bufsize, &result); if (result == NULL) { if (s == 0) printf("Not found\n"); else { errno = s; perror("getpwnam_r"); } exit(EXIT_FAILURE); } char *homedir = result.pw_dir;
如果你以root用户身份运行程序,那么你将有rwx访问这个目录。 在里面创build东西是好的,我想。