【发布时间】:2010-03-05 06:21:08
【问题描述】:
在 Unix/Linux 中保存用户配置数据的推荐方法是什么? 我的编程语言是 C++。配置数据将以 XML/文本/二进制格式保存,我处理这些文件没有问题。我想知道我可以把它们放在哪里。例如,在 Windows 操作系统中,配置数据可能保存在注册表(旧方式)或用户应用程序数据目录中。 Linux 呢? 我需要对配置文件的读/写权限。
【问题讨论】:
标签: c++ linux unix configuration-files
在 Unix/Linux 中保存用户配置数据的推荐方法是什么? 我的编程语言是 C++。配置数据将以 XML/文本/二进制格式保存,我处理这些文件没有问题。我想知道我可以把它们放在哪里。例如,在 Windows 操作系统中,配置数据可能保存在注册表(旧方式)或用户应用程序数据目录中。 Linux 呢? 我需要对配置文件的读/写权限。
【问题讨论】:
标签: c++ linux unix configuration-files
注册表的概念是 Windows 特有的,Microsoft 曾承认它的构思不正确(参见 this、this、this、this (see #2) 和 this)。
在 Unix 和 Linux 中,系统范围程序的配置位于 /etc 或特定于应用程序的子目录中。
每个用户的配置数据都保存在用户主目录中的隐藏文件(文本格式)或用户主目录中特定于应用程序的隐藏目录中。引用主目录的正确方法是通过环境变量HOME。通过将. 作为名称的第一个字符来创建隐藏文件和目录。
系统范围配置的示例是/etc/wgetrc 和/etc/ssh/。每个用户数据的示例是 $HOME/.bashrc 和 $HOME/.mozilla/。
【讨论】:
struct passwd *pw = getpwuid(getuid());(如果你需要线程安全,则应该使用getpwuid_r)然后使用pw->pw_dir的值
getenv("HOME") 并返回getpwuid(getuid())->pw_dir,以允许用户在需要时覆盖主目录。请参阅 ergosys 提到的基于 XDG 的规范:它允许用户覆盖几乎所有内容。
man 3 wordexp opengroup.org/onlinepubs/007908799/xsh/wordexp.html
XDG 基本目录规范指定配置和其他文件应存储在 Linux 和其他基于 X 的操作系统中的位置:
http://freedesktop.org/wiki/Specifications/basedir-spec
这是现代方式,最终可能会减少典型用户主目录中的点文件混乱。
【讨论】:
点文件是经典的 Unix 解决方案。如果您想自己处理阅读/编写所有内容,那就去做吧。
但是,我使用的大多数现代程序都使用GConf 来存储首选项。作为开发人员和用户(显然是管理员,但我没有这方面的经验),这让很多事情变得更容易。
【讨论】:
这在一定程度上取决于您的 Linux 风格,但作为一般规则,大多数程序在 /etc 中的某个位置都有系统默认配置,您的主目录中的 .config 文件可以覆盖 /etc 目录中的默认值。
好点 .config 应该是 .[配置文件的名称]
【讨论】: