Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中获取主目录 我需要一种在Linux上运行C++程序的用户主目录的方法。如果相同的代码在Unix上工作,那就太好了。我不想使用家庭环境值_C++_C_Linux - Fatal编程技术网

在Linux中获取主目录 我需要一种在Linux上运行C++程序的用户主目录的方法。如果相同的代码在Unix上工作,那就太好了。我不想使用家庭环境值

在Linux中获取主目录 我需要一种在Linux上运行C++程序的用户主目录的方法。如果相同的代码在Unix上工作,那就太好了。我不想使用家庭环境值,c++,c,linux,C++,C,Linux,好的,根主目录是/root。如果我的程序由root用户运行,是否可以在此目录中创建一些文件/文件夹?您需要getuid获取当前用户的用户id,然后getpuid获取该用户的密码条目(包括主目录): #include <unistd.h> #include <sys/types.h> #include <pwd.h> struct passwd *pw = getpwuid(getuid()); const char *homedir = pw->pw

好的,根主目录是/root。如果我的程序由root用户运行,是否可以在此目录中创建一些文件/文件夹?

您需要
getuid
获取当前用户的用户id,然后
getpuid
获取该用户的密码条目(包括主目录):

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

struct passwd *pw = getpwuid(getuid());

const char *homedir = pw->pw_dir;
#包括
#包括
#包括
结构passwd*pw=getpwuid(getuid());
const char*homedir=pw->pw_dir;

注意:如果在线程化应用程序中需要此功能,则需要使用
getpwuid\r

如果以root用户身份运行该程序,则可以使用rwx访问此目录。我想,在里面创建东西是可以的。

您应该首先检查
$HOME
环境变量,如果不存在,请使用getpwuid

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

const char *homedir;

if ((homedir = getenv("HOME")) == NULL) {
    homedir = getpwuid(getuid())->pw_dir;
}

用户(未命名)的当前主目录是
~
不是吗?正如在
cd~
中一样,
mv some_file~/some_file
等@NickBedford-
~
由shell实现,而不是内核或libc。在C++编程时,你需要自己实现。从程序员的角度来看,Linux是UNIX。它遵循同样的标准。它只是还没有被公开组认证。从用户的角度来看,Linux和“真正的”Unix系统之间的差别并不比认证系统之间的差别大。为什么不通过
getenv(“HOME”)
使用
$HOME
?HOME环境变量不可靠,因为它可以更改。塞缪尔·克拉奇科的回答更为精确。但是,你应该考虑如果用户重新定义了家的可能性,也许他们有理由这样做,并且你的程序将更好地服务于用户的需求,使用这个变量。手册页有这样一个警告:想要确定用户主目录的应用程序应该检查
home
(而不是
getpwuid(getuid())->pw_dir
)的值,因为这允许用户在登录会话期间修改其“主目录”的概念。我首先检查getenv(“home”)然后getpwuid()这不是对原始问题的好答案。这是在
/etc/passwd
中设置的shell启动目录,它可能是也可能不是用户的(活动)主目录。这是有用的信息,但是
getenv
是正确的答案。大多数程序应该更喜欢geteuid()而不是getuid()。否则,例如,如果您通过sudo运行一个命令,那么它将检查您的真实用户登录名,而不是sudo指定的登录名。在考虑使用seteuid()而不是setuid()时,还要注意,sudo不会更改环境变量。这意味着,如果您喜欢$HOME变量而不是getpwuid(),您将始终获得原始用户主目录,而不是有效的用户主目录。无法保证/root将是特定系统上root的主目录。将路径硬编码到应用程序中通常是一个非常糟糕的主意,因为这会使软件的可移植性大大降低。使用/root作为默认值(当HOMEDIR无法通过其他方式确定时)似乎是合理的,只要有办法通过配置覆盖它。@Hypher All true,尽管“如果我的程序由root用户运行,是否可以在此目录中创建一些文件/文件夹[/root]这个问题的答案是“是”.您可能需要一个互斥锁。否则,唯一的方法是
getpwuid\u r
。我不知道为什么该函数会干扰区域设置。这似乎缺少一个免费的buf。@克丽舍洛克我担心如果我在回答中使用了
free(buf)
,那么这可能会产生误导,并导致过早使用
free()
的问题,因为根据
getpwuid\r
的手册页:“passwd结构的成员指向的字符串字段存储在大小为buflen的缓冲区buf中。”因此只要
pwd
有用,
getenv(“HOME”)就仍然有用
在Ubuntu 17.10上为我返回了错误的内容。它返回了应用程序的工作目录。@jcarpenter2,因为用户应该能够覆盖进程正在使用的主目录。如果您仅仅依赖
getpwuid()
,则用户无法使用不同的
$home
运行进程。
struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1)
    bufsize = 0x4000; // = all zeroes with the 14th bit set (1 << 14)
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;