C snprintf指定用户主目录

时间:2017-04-22 16:44:23

标签: c file printf home-directory

我使用snprintf将格式化数据写入磁盘,但我有一个问题,如何将其保存到用户的主目录?

 snprintf(filename, sizeof(filename), "%s_%s.sho", client, id);

3 个答案:

答案 0 :(得分:3)

用户控制他的环境 - 因此HOME环境变量可能不正确,甚至可能无法设置。

使用getuid()getpwuid()获取系统指定的用户主目录:

#include <unistd.h>
#include <pwd.h>

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

/* need to duplicate the string - we don't know
   what pw_dir points to */
const char *homeDir = strdup( pwd->pw_dir );

错误检查留作练习......

答案 1 :(得分:2)

使用getenv(3)查询HOME环境变量的值。例如,这会打印我的主目录:

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    printf("%s\n", getenv("HOME"));
    return 0;
}

您可以将变量filename设置为返回值,然后在那里写下您想要的任何数据。

这适用于任何类Unix系统,包括Linux,macOS,BSD等等。

答案 2 :(得分:2)

在Linux和POSIX系统上,主目录常常来自HOME环境变量。所以你可以编码

snprintf(filename, sizeof(filename), "%s/%s_%s.sho", 
         getenv("HOME"), client, id);

谦虚地getenv(3)可能会失败(或错误)。但这很少发生。请参阅environ(7)

(您可以检查,或使用getpwuid(3)getuid(2) ...)

使用setuid可执行文件可能会变得非常复杂。您需要更准确地定义房屋的内容,并进行适当的编码(这是一个练习)。