【问题标题】:C snprintf specify user home directoryC snprintf 指定用户主目录
【发布时间】:2017-09-19 14:03:22
【问题描述】:

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

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

【问题讨论】:

  • 您要使用哪种操作系统?
  • @datenwolf:RHEL/CentOS Linux、macOS、COS Cray。
  • 顺便说一句,你不用snprintf写数据,你用它来建立文件路径。
  • 是的,抱歉我没说对。

标签: c file printf home-directory


【解决方案1】:

用户控制他的环境 - 所以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 );

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

【讨论】:

  • 如果有多个用户怎么办?
  • @YoshiMiro 如果有多个用户怎么办? 怎么办? UID 应该是唯一的。
【解决方案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 可执行文件,事情可能会变得非常复杂。您需要更准确地定义家是什么,并适当地编码(这留作练习)。

【讨论】:

  • getenv(3) 可能会失败(或错误)。但这种情况很少发生。请参阅 environ(7)。 当您发布该内容时,我正在处理我的答案...
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2015-11-25
    • 2013-01-22
    • 1970-01-01
    • 2013-02-10
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多