2010-04-19 6 views
2

J'ai un exécutable dont l'exécution doit prendre les paramètres de configuration à partir d'un fichier de script. De cette façon, je n'ai pas besoin de re-compiler le code pour chaque changement de configuration. En ce moment j'ai toutes les valeurs de configuration dans un fichier .h. Chaque fois que je le change, j'ai besoin de recompiler.Fichiers de configuration pour C sous Linux

La plate-forme est C, gcc sous Linux.

Quelle est la meilleure solution pour ce problème? J'ai regardé sur google et donc les liaisons XML, phthon et Lua pour C. L'utilisation d'un langage de script séparé est-elle la meilleure approche? Si oui, lequel recommanderiez-vous pour mon besoin?

Addendum: Et si je souhaitais mettre en miroir des structures de données dans des fichiers de script? Si j'ai un tableau de structures par exemple, s'il y a un moyen facile de le stocker et de le charger?

Merci

+3

Il suffit de stocker la configuration dans un fichier texte et de le lire depuis le programme C. –

+0

Que faire si je souhaite mettre en miroir des structures de données dans des fichiers de script? Si j'ai un tableau de structures par exemple, s'il y a un moyen facile de le stocker et de le charger? – James

+1

@James: Si vous voulez stocker des structures de données, alors XML ou peut-être même YAML est meilleur que le texte brut. – FrustratedWithFormsDesigner

Répondre

0

Vous pouvez relire le fichier de configuration quand un signal tel que SIGUSR1 est reçu.

+0

pourquoi pas SIG_HUP? –

+1

SIGHUP est pour les serveurs. –

1

Qu'est-ce qui ne va pas avec un fichier texte? Ces paramètres de configuration sont-ils lus une fois au démarrage de l'application ou de façon continue tout au long de la vie de l'application? Quand sont-ils écrits? Il semble qu'ils ne soient lus qu'une fois au début de l'application, car vous devez les recompiler chaque fois qu'ils changent.

S'il y a seulement une poignée de valeurs, alors je dirais que rester simple et bâton avec un fichier texte formaté sous forme de paires clé/valeur:

Config1 = 1 
ConfigValue2 = 33.4 
ConfigValue3 = ABC 

Si vous avez des paramètres plus complexes, peut-être une certaine hiérarchie des valeurs, XML pourrait avoir plus de sens.

1

De combien de configuration avez-vous besoin pour qu'il s'agisse d'un "fichier script"?

Je garde juste un petit morceau de code à portée de main qui est un analyseur de format ini.

2

La façon la plus simple serait d'avoir un fichier texte contenant quelque chose comme:

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

Et vous suffit d'ouvrir ce fichier et l'analyser, mettre tout en quelque chose comme un hashmap/dictionnaire.

Une recherche rapide sur google propose une bibliothèque (libConfuse) qui peut le faire pour vous.

+3

Bons vieux fichiers de configuration! –

0

vous pouvez simplement stocker toutes les configurations des valeurs externes et le lire avec l'ancienne plaine C

vous pouvez faire quelque chose comme:

param = valeur param2 = valeur2

et lire normalement fgets, puis faites un strtok à la recherche de '=' et ensuite vous avez à la fois des paramètres et des valeurs.

si vous voulez utiliser XML que je vous recommande libxml2.

+1

Évitez strtok() :) –

2

Check out CCANciniparser. C'est un fork de the original iniparser (qui n'est plus maintenu) et facilite l'analyse des fichiers de configuration de style INI.

code de l'exemple (presque en miroir par les tests unitaires):

#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; 
} 

Bien sûr, vous pouvez simplement déposer les quelques fichiers nécessaires dans votre arbre et #include "iniparser.h", il n'y a pas de dépendances sur d'autres modules CCAN moins vous voulez exécuter les tests unitaires.

Un exemple de configuration pourrait ressembler à ceci:

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

[cartoons] 
tom_hates=jerry 

Obtenir la valeur de stooges:shemp produirait une statiquement allouée questionable que vous utilisez en l'état (sans modification) ou allouez et en double (à savoir strdup()). Cela ne devient pas beaucoup plus facile que ça. Envelopper l'accès au dictionnaire avec un mutex simple et son thread sécurisé.

CCAN est le réseau d'archives complètes. Pensez CPAN, juste C. Son projet Rusty Russell a commencé il y a quelques temps, ce qui finit par gagner du terrain.

Avis de non-responsabilité: Je gère le module.

5

Je recommande Lua. Il a été conçu pour la configuration. Pourquoi auriez-vous besoin d'une langue distincte pour lire un fichier?

Questions connexes