C snprintf指定用户主目录

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

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

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

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

小心翼翼地, getenv(3)可能会失败(或错误)。 但这很少发生。 见环境(7) 。

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

使用setuid可执行文件,事情可能变得有趣复杂。 您需要更准确地定义房屋的内容和适当的代码(这是一个练习)。

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

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

 #include  #include  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 ); 

错误检查留作练习……

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

 #include  #include  int main(void) { printf("%s\n", getenv("HOME")); return 0; } 

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

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