Linux中C的配置文件

2 投票
7 回答
846 浏览
提问于 2025-04-15 21:46

我有一个可执行程序,它在运行时需要从一个脚本文件中获取配置参数。这样我就不需要每次修改配置时都重新编译代码。目前,我把所有的配置值都放在一个.h文件里,每次修改都得重新编译。

我的平台是C语言,使用的是Linux下的gcc编译器。

解决这个问题的最佳方法是什么呢?我在网上查了一下,发现有XML、Python和Lua等可以和C语言结合的脚本语言。使用一个单独的脚本语言是最好的方法吗?如果是的话,你会推荐哪一种来满足我的需求呢?

补充说明:如果我想在脚本文件中反映数据结构,比如说我有一个结构体数组,有没有简单的方法来存储和加载它呢?

谢谢!

7 个回答

2

可以看看 CCANciniparser。这个是 原版 iniparser 的一个分支(原版已经不再维护),它让解析 INI 风格的配置文件变得很简单。

下面是一个示例代码(几乎和单元测试的代码一模一样):

#include <stdio.h>
#include <stdbool.h>
#include <ccan/ciniparser/ciniparser.h>

#define CONFIG_FILE "/etc/config.ini"

int main(int argc, char *argv[])
{
        dictionary *d;
        char *val1;
        bool val2;
        double val3;
        int val4;

        d = ciniparser_load(CONFIG_FILE);
        if (d == NULL)
            return 1;

        val1 = ciniparser_getstring(d, "daemon:pidfile", NULL);
        val2 = ciniparser_getboolean(d, "daemon:debug", false);
        val3 = ciniparser_getdouble(d, "daemon:maxload", 3.5);
        val4 = ciniparser_getint(d, "daemon:maxchild", 5);

        ciniparser_freedict(d);

        return 0;
}

当然,你只需要把几个必要的文件放到你的项目里,然后 #include "iniparser.h",除非你想运行单元测试,否则不需要依赖其他 CCAN 模块。

一个示例配置可能长这样:

[stooges]
larry=larry_stooge
curly=curly_stooge
moe=moe_stooge
shemp=questionable

[cartoons]
tom_hates=jerry

获取 stooges:shemp 的值会得到一个静态分配的 questionable,你可以直接使用它(不需要修改),或者分配一个新的副本(也就是 strdup())。这真的是非常简单。用一个简单的互斥锁来包裹对字典的访问,这样就线程安全了。

CCAN 是综合 C 归档网络。可以想象成 CPAN,只是针对 C 的。这个项目是 Rusty Russell 之前开始的,现在终于开始受到关注了。

免责声明:我维护这个模块。

2

最简单的方法就是准备一个文本文件,里面写一些类似这样的内容:

key = value
key2 = anothervalue
....
keyn = etc

然后你只需要打开这个文件,把里面的内容解析出来,放到一个像哈希表或者字典这样的结构里。

在谷歌上简单搜索一下,你会找到一个库(libConfuse),它可以帮你完成这个工作。

5

我推荐使用Lua。它是为了配置而设计的。

撰写回答