Linux中C的配置文件
我有一个可执行程序,它在运行时需要从一个脚本文件中获取配置参数。这样我就不需要每次修改配置时都重新编译代码。目前,我把所有的配置值都放在一个.h文件里,每次修改都得重新编译。
我的平台是C语言,使用的是Linux下的gcc编译器。
解决这个问题的最佳方法是什么呢?我在网上查了一下,发现有XML、Python和Lua等可以和C语言结合的脚本语言。使用一个单独的脚本语言是最好的方法吗?如果是的话,你会推荐哪一种来满足我的需求呢?
补充说明:如果我想在脚本文件中反映数据结构,比如说我有一个结构体数组,有没有简单的方法来存储和加载它呢?
谢谢!
7 个回答
可以看看 CCAN 和 ciniparser。这个是 原版 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 之前开始的,现在终于开始受到关注了。
免责声明:我维护这个模块。
最简单的方法就是准备一个文本文件,里面写一些类似这样的内容:
key = value
key2 = anothervalue
....
keyn = etc
然后你只需要打开这个文件,把里面的内容解析出来,放到一个像哈希表或者字典这样的结构里。
在谷歌上简单搜索一下,你会找到一个库(libConfuse),它可以帮你完成这个工作。
我推荐使用Lua。它是为了配置而设计的。