Jak inicializovat C program pomocí souboru, životního prostředí a / nebo příkazového řádku?

hlasů
5

V jazyce C, jak konfigurovat výchozí nastavení z nějakého programu, s použitím párů klíč-hodnota, přičemž některé nebo všechny z: textovém konfiguračním souboru , proměnné prostředí, a opcí na příkazovém řádku. Také, jak se rozhodnout, která metoda je hodnoty overide ty z některého z dalších dvou. Pak, pokud byly změněny hodnoty, volitelně aktualizovat konfigurační soubor.

Co je to nejjednodušší způsob, jak to udělat, a co když existuje, jsou nejvíce uznávané metody? Je tam, nejlépe malý open source program, který dává dobrý příklad toho, jak to lze udělat?

Položena 08/05/2009 v 13:27
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
5

Eric Raymond pokrývá hodně to v § 10 The Art of Unix programování Zřejmě to Unix centric, ale většina z principů lze použít v libovolném operačním systému.

Odpovězeno 08/05/2009 v 15:15
zdroj uživatelem

hlasů
5

Základy:

  • Chcete-li konfigurovat program pomocí proměnných prostředí, můžete použít funkci getenv definované v stdlib.h.
  • Chcete-li konfigurovat program pomocí příkazového řádku argumenty, deklarovat svou hlavní funkci jako ‚int main (int argc, const char * const * argv)‘ a použít smyčku jít nad argumenty v argv pole. Jeho velikost je dána argc.
  • Chcete-li konfigurovat program pomocí konfiguračního souboru, nejlépe vybrat nějakou knihovnu dělá to pro vás namísto vymýšlení ještě další vlastní formát konfiguračního souboru. Všimněte si, že v závislosti na platformě cílíte, tam jsou také knihovny analyzovat příkazové argumenty.

Která nastavení zdroj by měl přepsat navzájem závisí na aplikaci, ale podle mého názoru obecně příkazové argumentem> proměnná prostředí> konfigurační soubor dává největší smysl.

Zde je příklad, jak se dostat konfiguraci z oblasti životního prostředí a příkazové řádky, s příkazové převažující životní prostředí:

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

Už jste vidět, že se stává velmi dlouhé a únavné velmi brzy, takže lépe využít existující knihovny pokud existuje pro požadovanou cílovou platformu (y), nebo alespoň faktorem tento druh kódu do řady funkcí.

Další zajímavou možností je vázat skriptovací jazyk pro aplikace, pak byste mohli vytvořit svůj aplikační jen pro čtení a „spustit“ soubor nastavení a uživatel může konfigurovat nastavení souboru číst některá nastavení z oblasti životního prostředí a některé z příkazové řádky, například. To opravdu záleží na typu a velikosti aplikací a vaší cílové skupiny, zda je to stojí za to ačkoli.

Odpovězeno 08/05/2009 v 13:54
zdroj uživatelem

hlasů
2

Otázkou je, není příliš jasné. Je otázka „co mechanismy existují?“, „Jaké jsou konvence pro argumenty a formátů?“ Nebo „Jak byste mi kombinovat?“?

Existuje několik poměrně standardní způsoby (alespoň ve světě Unix):

  • proměnné prostředí
  • konfigurační soubory
  • argumenty příkazového řádku
  • jako podmnožina výše uvedených skutečností, konfigurační soubory zadané na příkazové řádce

Chcete-li zvolit, jaké metody použít pro svůj vlastní program, prozkoumat mnoho programů z kánonu přijatého praxe před mrazem své vlastní volby, četl některé blogy, přečíst některé knihy ...

Konfigurační soubory jsou pravděpodobně nejvíce přenosná mezi různými operačními systémy.

Léčba může dostat poměrně složité. V případě, že argumenty příkazové řádky může ovlivnit interpretaci konfigurační soubory a proměnné prostředí, ale přesto chcete příkazový řádek se neruší jiné mechanismy (dobrý nápad), můžete potřebovat tři průchody:

  1. Analyzovat příkazový řádek a nastavit všechny proměnné, které ovlivňují další nastavení (řekněme který konfigurační soubor pro čtení)
  2. Zvládnout konfigurační soubory a proměnné prostředí (v jakém pořadí?)
  3. Opětovné spuštění příkazového řádku přepsat všechna ostatní nastavení.

V tradici unix prohlédnout getopta getopt_long. Také vzít v úvahu nástroje jakogengetopt

Vy můžete zjednodušit konfiguračního souboru problém tím, že je shell skripty, které nastavují proměnné prostředí (ale to vás uzamkne do modelu Unix). Rozebrat prostý text je snadné a multiplatformní, ale dělá více kódu psát. Za použití standardního formátu a knihovna klade nároky na vaší uživatelské prostředí sestavení, ale měl by ušetřit na chyby a nejasnosti.


Pokud konfigurace prostředí je složitější, to je velmi užitečné, aby zapouzdřit konfigurační stav v konstrukci, která může být předán kolem, jak je potřeba. To je přístup pořízena gengetopt, a já jsem zjistil, že je užitečné.

Odpovězeno 08/05/2009 v 13:34
zdroj uživatelem

hlasů
2

Existují tuny knihoven pro práci s konfiguračním souborem rozebrat, pro různé formáty. Podívejte se na formáty XML a INI pro dvě populární volby. Psaní vlastní parser je pravděpodobně špatný nápad, protože to může být hodně práce za málo nebo žádný zisk. Zde je náhodný C knihovna pro rozebrat INI souborů XML je ponechán jako cvičení.

Prioritou mezi nastavením je obvykle taková, že možnosti příkazového řádku přednost před nastavením „environmentální“. Navrhoval bych priority, jako je tento, v klesající pořadí podle důležitosti:

  1. Možnosti příkazového řádku přepíše cokoliv
  2. Soubor nastavení je next
    • Někdy rozdělit mezi místní a globálního systému souborů uživatele
  3. Příští přijít proměnné prostředí

Ale 2 a 3 by mohl dobře být převrácený.

Odpovězeno 08/05/2009 v 13:31
zdroj uživatelem

hlasů
1

Lua jazyk částečně dostal jeho začátek motivována potřebou mít dobře definovanou konfiguraci jazyka pro kolekci nástrojů. Zůstává poměrně snadno integrovat Lua jako konfigurační jazyk. Docela Kompletní příklad je v knize programování v Lua, starší vydání, které je k dispozici on-line. Kapitola 25 popisuje pomocí rozhraní API Lua C vložit Lua v podobě konfigurační jazyk, a důvody, proč byste mohli chtít, aby to udělat.

Odpovězeno 09/05/2009 v 02:13
zdroj uživatelem

hlasů
1

U unixových návrhových vzorů v této oblasti, podívejte se na Raymond „The Art of Unix programování “. Pojednává o stanovení priorit pro argumenty příkazového řádku nad proměnných prostředí a konfiguračních souborů, a tak dále.

Odpovězeno 08/05/2009 v 15:30
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more