微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux中C的configuration文件

我有一个可执行文件,运行时应该从脚本文件获取configuration参数。 这样我不需要重新编译每个configuration更改的代码。 现在我有一个.h文件中的所有configuration值。 每次我改变它,我需要重新编译。

该平台是Linux下的C,gcc。

这个问题最好的解决scheme是什么? 我仰望谷歌和XML,Ph和Lua绑定为C.是否使用单独的脚本语言最好的方法? 如果是这样,你会推荐哪一个我的需要?

附录:如果我想在脚本文件中镜像数据结构怎么办? 如果我有一个结构数组,例如,如果有一个简单的方法来存储和加载它?

使用IntelliJ IDE和Lua编程语言制作Corona应用程序

有没有办法使用grep(或任何其他工具)过滤文本文件,以便您可以获取包裹在护腕或括号中的文件的一部分?

lua套接字客户端

如何在ubuntu上更新lua软件包?

哪种脚本语言更适合在multithreadingC / C ++应用程序中embedded

谢谢

os.execute()与命令行选项

lua dofile“没有这样的文件或目录”在Windows中

为什么lua的string模式匹配这样做?

创build独立的Lua可执行文件

在Win7上安装Torch7; cmake和PATH问题

我建议Lua 。 它是为配置而设计的。

最简单的方法是有一个文本文件包含像这样的东西:

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

然后你只需打开这个文件并解析它,把所有的东西都放在hashmap / dictionary中。

在google上快速搜索出来一个库( libConfuse ),可以为你做这个。

检查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的价值stooges:shemp会产生一个静态分配的questionable ,您将按原样使用(不进行修改)或分配和复制(即strdup() )。 这并不容易。 用简单的互斥体和线程安全地访问字典。

CCAN是综合C归档网络。 认为CPAN ,只是C 它的一个项目Rusty Russell刚开始,最终获得了一些牵引力。

免责声明:我维护模块。

纯文本文件有什么问题? 这些配置设置是在应用程序启动时读取一次,还是在应用程序的整个生命周期中一直读取? 他们什么时候写的? 这听起来像只在应用程序开始时才读取一次,因为每次更改时都需要重新编译。

如果只有少数值,那么我会说保持简单,并坚持使用格式化为键/值对的文本文件

Config1 = 1 ConfigValue2 = 33.4 ConfigValue3 = ABC

如果你有更复杂的设置,也许有一些价值层次,XML可能更有意义。

你需要多少配置才能成为“脚本文件”?

我只是保留了一小块代码,这是一个ini格式的解析器。

当收到SIGUSR1等信号时,可以重新读取配置文件

您可以将所有配置值存储在外部,并使用旧的普通C读取

你可以做一些事情:

param = value param2 = value2

并用fgets正常读取,然后做一个strtok寻找'=',然后你有参数和值。

如果你想使用XML,我建议你使用libxml2。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐