C snprintf 指定用户主目录

C snprintf specify user home directory

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

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

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

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

您可以将变量 filename 设置为 return 值,然后在其中写入您想要的任何数据。

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

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

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

迂腐地getenv(3) could fail (or be wrong). But that rarely happens. See environ(7)

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

使用 setuid 可执行文件,事情可能会变得非常复杂。您需要更准确地定义房屋是什么,并适当地编写代码(留作练习)。

用户控制着他的环境 - 所以 HOME 环境变量可能不正确,甚至可能没有设置。

使用getuid() and 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 );

错误检查留作练习...