Файлы конфигурации для C в Linux - PullRequest
2 голосов
/ 19 апреля 2010

У меня есть исполняемый файл, который во время выполнения должен принимать параметры конфигурации из файла сценария. Таким образом, мне не нужно перекомпилировать код для каждого изменения конфигурации. Прямо сейчас у меня есть все значения конфигурации в .h файле. Каждый раз, когда я изменяю это, мне нужно перекомпилировать.

Платформа - C, gcc под Linux.

Как лучше всего решить эту проблему? Я посмотрел на Google, и поэтому привязки XML, phthon и Lua для C. Является ли использование отдельного языка сценариев лучшим подходом? Если да, какой из них вы бы порекомендовали для моих нужд?

Приложение: Что если я хотел бы отразить структуры данных в файлах сценариев? Если у меня есть массив структур, например, есть ли простой способ сохранить и загрузить его?

Спасибо

Ответы [ 7 ]

5 голосов
/ 20 апреля 2010

Я рекомендую Луа . Он был разработан для конфигурации.

2 голосов
/ 19 апреля 2010

Выезд 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 , начатый недавно, который наконец набирает обороты.

Отказ от ответственности: я поддерживаю модуль.

2 голосов
/ 19 апреля 2010

Самый простой способ - создать текстовый файл, содержащий что-то вроде:

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

А затем вы просто открываете этот файл и анализируете его, помещая все в нечто вроде хэш-карты / словаря.

Быстрый поиск в Google позволяет найти библиотеку ( libConfuse ), которая может сделать это за вас.

1 голос
/ 19 апреля 2010

Сколько конфигурации вам нужно, чтобы это был «файл скрипта»?

Я просто держу небольшой кусок кода под рукой, это парсер формата ini.

1 голос
/ 19 апреля 2010

Что не так с простым текстовым файлом? Читаются ли эти параметры конфигурации один раз при запуске приложения или постоянно в течение всего срока службы приложения? Когда они пишутся? Похоже, что они читаются только один раз в начале приложения, потому что вам нужно перекомпилировать каждый раз, когда они меняются.

Если есть только несколько значений, я бы сказал, что будьте проще и придерживайтесь текстового файла, отформатированного как пары ключ / значение:

Config1 = 1
ConfigValue2 = 33.4
ConfigValue3 = ABC

Если у вас более сложные настройки, например иерархия значений, XML может иметь больше смысла.

0 голосов
/ 19 апреля 2010

вы можете просто сохранить все значения конфигурации снаружи и прочитать их со старой простой C

, вы можете сделать что-то вроде:

param = значение param2 = значение2

иобычно читайте его с помощью fgets, а затем выполните strtok, ищущий '=', и тогда у вас есть и параметры, и значения.

, если вы хотите использовать XML, я рекомендую вам libxml2.

0 голосов
/ 19 апреля 2010

Вы можете перечитать файл конфигурации при получении сигнала, такого как SIGUSR1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...