Comment initialiser un programme C en utilisant un fichier, un environnement et / ou une ligne de commande?

StackOverflow https://stackoverflow.com/questions/839565

Question

En C, comment configurer les paramètres initiaux de certains programmes, à l'aide de paires clé-valeur, avec tout ou partie des éléments suivants: un texte brut fichier de configuration , variables d’environnement et options de la ligne de commande. En outre, comment déterminer les valeurs de la méthode par rapport à celles des deux autres. Ensuite, si les valeurs ont été modifiées, vous pouvez éventuellement mettre à jour le fichier de configuration.

Quelle est la façon la plus simple de procéder, et quelles sont les méthodes les plus acceptées, le cas échéant? Existe-t-il un programme open source de préférence petit qui donne un bon exemple de la façon dont cela peut être fait?

Était-ce utile?

La solution

Les bases:

  • Pour configurer votre programme à l'aide de variables d'environnement, vous pouvez utiliser la fonction getenv définie dans stdlib.h.
  • Pour configurer votre programme à l'aide d'arguments de ligne de commande, déclarez votre fonction principale comme suit: 'int main (int argc, const car * const * argv)' et utilisez une boucle pour examiner les arguments du tableau argv. Sa taille est donnée par argc.
  • Pour configurer votre programme à l'aide d'un fichier de configuration, choisissez de préférence une bibliothèque qui le fait pour vous plutôt que d'inventer un autre format de fichier de configuration personnalisé. Notez que, selon la plate-forme que vous ciblez, il existe également des bibliothèques pour analyser les arguments de la ligne de commande.

Le choix de la source des paramètres dépend de l'application, mais à mon avis, l'argument de ligne de commande généralement > variable d'environnement > Le fichier de configuration a plus de sens.

Voici un exemple d'obtention de la configuration de l'environnement et de la ligne de commande, avec un environnement de substitution de la ligne de commande:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char* const* argv) {
    int i;
    const char* myConfigVar;

    // get default setting from environment
    myConfigVar = getenv("MY_CONFIG_VAR");

    // if the variable wasn't defined, initialize to hardcoded default
    if (!myConfigVar)
        myConfigVar = "default value";

    // parse commandline arguments
    // start at 1, because argv[0] contains the name of the program
    for (i = 1; i < argc; ++i) {
        if (strcmp("--my-config-var", argv[i]) == 0) {
            if (i + 1 < argc)
                myConfigVar = argv[i + 1];
            else
                printf("missing value for my-config-var argument\n");
        }
    }

    printf("myConfigVar = '%s'\n", myConfigVar);
    return 0;
}

Vous voyez déjà qu'il devient très long et très fastidieux, il est donc préférable d'utiliser une bibliothèque existante s'il en existe une pour la ou les plates-formes cibles souhaitées, ou au moins d'intégrer ce type de code à un certain nombre de fonctions.

Une autre option intéressante consiste à lier un langage de script à votre application. Vous pouvez alors faire en sorte que votre application lise et "exécute" uniquement. votre fichier de paramètres et l’utilisateur peut configurer le fichier de paramètres pour lire certains paramètres de l’environnement et d’autres de la ligne de commande, par exemple. Cela dépend vraiment du type et de la taille de l'application et de votre public cible, que cela vaille la peine d'être fait ou non.

Autres conseils

Eric Raymond en traite en grande partie dans la section 10 de la L’art de la programmation Unix Évidemment, cela est centré sur Unix, mais la plupart des principes peuvent être appliqués à n’importe quel système d'exploitation.

Il existe une multitude de bibliothèques pour traiter l’analyse des fichiers de configuration, pour différents formats. Recherchez les formats XML et INI pour deux choix courants. Écrire un analyseur personnalisé est probablement une mauvaise idée car cela peut représenter beaucoup de travail pour un gain minime, voire nul. Voici une bibliothèque C aléatoire pour l'analyse de fichiers INI, XML est laissé comme exercice.

La priorité entre les paramètres est généralement telle que les options de ligne de commande remplacent les options "environnementales". réglages. Je suggérerais des priorités comme celle-ci, par ordre d'importance décroissant:

  1. Les options de ligne de commande remplacent tout
  2. Le fichier de configuration est le suivant
    • Parfois divisé entre les fichiers locaux de l'utilisateur et les fichiers globaux du système
  3. Viennent ensuite les variables d'environnement

Mais les 2 et 3 pourraient bien être inversés.

La question n’est pas très claire. La question "Quels sont les mécanismes existants?", "Quelles sont les conventions pour les arguments et les formats?" Ou "Comment dois-je mélanger et faire correspondre?"?

Il existe plusieurs méthodes assez classiques (du moins dans le monde Unix):

  • variables d'environnement
  • fichiers de configuration
  • arguments de ligne de commande
  • en tant que sous-ensemble de ce qui précède, les fichiers de configuration spécifiés sur la ligne de commande

Pour choisir les méthodes à utiliser pour votre propre programme, examinez de nombreux programmes du canon des pratiques acceptées avant de geler vos propres choix, de lire des blogs, de lire des livres ...

Les fichiers de configuration sont probablement les plus portables sur tous les systèmes d'exploitation.

Le traitement peut devenir assez compliqué. Si les arguments de la ligne de commande risquent d’affecter l’interprétation des fichiers de configuration ou de la variable d’environnement, mais que vous souhaitiez toujours que la ligne de commande remplace les autres mécanismes (une bonne idée), vous devrez peut-être passer trois fois:

  1. Analyser la ligne de commande et définir les variables qui affectent d'autres paramètres (par exemple, le fichier de configuration à lire)
  2. Traiter les fichiers de configuration et la variable d'environnement (quel ordre?)
  3. Réexécutez la ligne de commande pour remplacer tous les autres paramètres.

Dans la tradition unix, examinez getopt et getopt_long . Pensez également à des outils tels que gengetopt

Vous pouvez simplifier votre problème de fichier de configuration en les transformant en scripts shell définissant des variables d’environnement (mais cela vous verrouille dans un modèle unix). L'analyse du texte brut est facile et multi-plateforme, mais génère plus de code à écrire. L'utilisation d'un format standard et d'une bibliothèque impose des exigences à l'environnement de construction de votre utilisateur, mais doit éviter les bugs et la confusion.

Si votre environnement de configuration est compliqué, il est très utile d’encapsuler l’état de la configuration dans une structure qui peut être transmise au besoin. C'est l'approche adoptée par gengetopt et je l'ai trouvée utile.

Pour les modèles de conception de type Unix dans cette zone, consultez la section "The de Art" de Unix Programmation " ;. Il traite de la hiérarchisation des arguments de ligne de commande par rapport aux variables d’environnement et aux fichiers de configuration, etc.

.

La langue Lua a été lancée en partie par la nécessité de disposer d'un langage de configuration bien défini pour une collection d'outils. Il reste assez facile d'intégrer Lua en tant que langage de configuration. Un exemple assez complet est fourni dans le livre Programming in Lua, dont une ancienne édition est disponible en ligne. Le chapitre 25 décrit l'utilisation de l'API Lua C pour incorporer Lua en tant que langage de configuration, et les raisons pourquoi vous voudrez peut-être faire cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top