簡體   English   中英

Linux中C的配置文件

[英]Configuration files for C in linux

我有一個可執行文件,運行時應該從腳本文件中獲取配置參數。 這樣我就不需要為每個配置更改重新編譯代碼。 現在我在.h文件中有所有配置值。 每次我改變它我都需要重新編譯。

該平台是Linux下的C,gcc。

這個問題的最佳解決方案是什么? 我查了谷歌,因此對C語言的XML,phthon和Lua綁定。使用單獨的腳本語言是最好的方法嗎? 如果是這樣,你會根據我的需要推薦哪一個?

附錄:如果我想鏡像腳本文件中的數據結構怎么辦? 例如,如果我有一個結構數組,是否有一種簡單的方法來存儲和加載它?

謝謝

我推薦Lua 它專為配置而設計。

最簡單的方法是使文本文件包含以下內容:

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

然后你只需打開這個文件並解析它,將所有內容放在類似hashmap / dictionary的內容中。

在谷歌上進行快速搜索會找到一個可以為您執行此操作的庫( 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是Comprehensive C Archive網絡。 想想CPAN ,只是C 它的一個項目Rusty Russell剛開始,最終獲得了一些牽引力。

免責聲明:我維護模塊。

純文本文件有什么問題? 這些配置設置是在應用程序啟動時讀取一次,還是在應用程序的整個生命周期內連續讀取? 他們什么時候寫的? 聽起來他們只在應用程序開始時才讀取一次,因為每次更改時都需要重新編譯。

如果只有少數幾個值,那么我會說保持簡單並堅持使用格式化為鍵/值對的文本文件:

Config1 = 1
ConfigValue2 = 33.4
ConfigValue3 = ABC

如果您有更復雜的設置,可能是某些值的層次結構,XML可能更有意義。

您需要多少配置才能成為“腳本文件”?

我只是保留了一小塊代碼,這是一個ini格式解析器。

收到SIGUSR1等信號時,可以重新讀取配置文件。

您可以在外部存儲所有配置值,並使用舊的普通C讀取它

你可以這樣做:

param = value param2 = value2

並用fgets正常讀取它然后做一個strtok尋找'='然后你有params和值。

如果你想使用XML我推薦你libxml2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM