Unix/Linux 中的程序配置数据

Posted

技术标签:

【中文标题】Unix/Linux 中的程序配置数据【英文标题】:Program configuration data in Unix/Linux 【发布时间】:2010-03-05 06:21:08 【问题描述】:

在 Unix/Linux 中保存用户配置数据的推荐方法是什么? 我的编程语言是 C++。配置数据将以 XML/文本/二进制格式保存,我处理这些文件没有问题。我想知道我可以把它们放在哪里。例如,在 Windows 操作系统中,配置数据可能保存在注册表(旧方式)或用户应用程序数据目录中。 Linux 呢? 我需要对配置文件的读/写权限。

【问题讨论】:

【参考方案1】:

注册表的概念是 Windows 特有的,Microsoft 曾承认它的构思不正确(参见 this、this、this、this (see #2) 和 this)。

在 Unix 和 Linux 中,系统范围程序的配置位于 /etc 或特定于应用程序的子目录中。

每个用户的配置数据都保存在用户主目录中的隐藏文件(文本格式)或用户主目录中特定于应用程序的隐藏目录中。引用主目录的正确方法是通过环境变量HOME。通过将. 作为名称的第一个字符来创建隐藏文件和目录。

系统范围配置的示例是/etc/wgetrc/etc/ssh/。每个用户数据的示例是 $HOME/.bashrc$HOME/.mozilla/

【讨论】:

您不应依赖环境变量 HOME。因为我们说的是可以进行系统调用的 C++,所以你应该使用struct passwd *pw = getpwuid(getuid());(如果你需要线程安全,则应该使用getpwuid_r)然后使用pw->pw_dir的值 好建议。我从来没有遇到过使用 $HOME 的问题。我注意到许多程序也必须以这种方式工作,因为有时我会用有用的预期结果覆盖 HOME。 谢谢,我想我会关注这个的。顺便说一句,我可以在程序中使用“~”作为主目录吗? 实际上,我会使用getenv("HOME") 并返回getpwuid(getuid())->pw_dir,以允许用户在需要时覆盖主目录。请参阅 ergosys 提到的基于 XDG 的规范:它允许用户覆盖几乎所有内容。 @wallyk man 3 wordexp opengroup.org/onlinepubs/007908799/xsh/wordexp.html【参考方案2】:

XDG 基本目录规范指定配置和其他文件应存储在 Linux 和其他基于 X 的操作系统中的位置:

http://freedesktop.org/wiki/Specifications/basedir-spec

这是现代方式,最终可能会减少典型用户主目录中的点文件混乱。

【讨论】:

【参考方案3】:

点文件是经典的 Unix 解决方案。如果您想自己处理阅读/编写所有内容,那就去做吧。

但是,我使用的大多数现代程序都使用GConf 来存储首选项。作为开发人员和用户(显然是管理员,但我没有这方面的经验),这让很多事情变得更容易。

【讨论】:

关于 GConf 的好点,谢谢。就我而言,我有用于管理 XML 配置文件的跨平台代码,该代码已经在 Windows 中运行。完成此操作后,我需要添加特定于平台的代码来选择配置文件路径。 api.kde.org/4.0-api/kdelibs-apidocs/kdecore/html/… 用于其他流行桌面的配置方案。【参考方案4】:

这在一定程度上取决于您的 Linux 风格,但作为一般规则,大多数程序在 /etc 中的某个位置都有系统默认配置,您的主目录中的 .config 文件可以覆盖 /etc 目录中的默认值。


好点 .config 应该是 .[配置文件的名称]

【讨论】:

您可能想澄清一下,“.config”实际上是指名称以“.”开头的文件,不是扩展名为“.config”的文件。这 ”。”前缀是默认情况下保持文件“隐藏”。有一堆配置文件的程序有时会有一个“.config”目录,里面有文件。此外,old-skool Unix 应用程序倾向于使用名称“.[appname]rc”作为其配置文件/目录。

以上是关于Unix/Linux 中的程序配置数据的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell介绍 及克隆配置

我需要列出在 UNIX/Linux 中具有链接到它们的指定共享库的程序(如 ldd,反之亦然)

Cygwin-安装和配置ssh服务

NFS服务器配置(UNIX/Linux操作系统之间文件共享)--Linux

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间

linux系统常用命令