2009-05-08 7 views
5

Cでは、キーと値のペアを使用して、プログラムの初期設定を構成するには、プレーンテキストconfiguration file、環境変数、およびコマンドラインのオプションのいずれかまたはすべてを使用する方法があります。また、どのメソッドの値が他の2つのメソッドの値を上回るかを決定する方法。次に、値が変更されている場合は、オプションで構成ファイルを更新します。ファイル、環境、コマンドラインを使ってCプログラムを初期化するには?

これを行う最も簡単な方法は何ですか?また、最も一般的な方法は何ですか。これができる方法の良い例を示す、好ましくは小さなオープンソースプログラムがありますか?

答えて

5

基礎:

  • 環境変数を使用してプログラムを設定するには、stdlib.hで定義されたgetenv関数を使用することができます。
  • コマンドライン引数を使用してプログラムを構成するには、 'int main(int argc、const char * const * argv)'のようなmain関数を宣言し、ループを使用してargv配列の引数を調べます。サイズはargcで与えられます。
  • 構成ファイルを使用してプログラムを構成するには、別のカスタム構成ファイル形式を作成する代わりに、このためのライブラリをいくつか選択することをお勧めします。ターゲットとするプラットフォームに応じて、コマンドライン引数を解析するライブラリもあります。

どちらの設定ソースは、アプリケーションによって異なりますが、私の意見では一般的にはコマンドライン引数>環境変数>設定ファイルが最も理にかなっています。ここで

は、コマンドラインオーバーライド環境で、環境やコマンドラインから設定を取得する例を示します。

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

あなたは既に1が存在する場合ので、より優れた既存のライブラリを使用し、それは非常にすぐに非常に長くて退屈になっご覧くださいあなたの望むターゲットプラットフォーム、または少なくともこの種のコードをいくつかの機能に組み込みます。

もう一つの興味深い選択肢は、スクリプト言語をアプリケーションにバインドして、アプリケーションで設定ファイルを読み込んで「実行」させることができます。また、ユーザーは設定ファイルを設定して、例えば、コマンドラインから。これは本当に価値があるかどうかは、アプリケーションのタイプとサイズ、ターゲットオーディエンスによって異なります。

+0

OK、最後の行を削除しました:) – Tobi

2

構成ファイルの解析には、さまざまな形式のライブラリがあります。 2つの一般的な選択肢のXMLおよびINI形式を探します。カスタムパーサーを書くことは、おそらくほとんどまたはまったく役に立たないので、多分悪い考えです。 Hereは、INIファイルを解析するためのランダムなCライブラリです。XMLはエクササイズとして残されています。

設定の優先順位は、通常、コマンドラインオプションが「環境」設定を上書きするようなものです。私は重要なの落下ために、このような優先順位を示唆している:

  1. コマンドラインオプションを何も
  2. 設定ファイルは時々
  3. ユーザーのローカル、およびシステム・グローバルのファイルに分割
    • 次で上書きします
    • 次の環境変数

しかし、 2と3はうまく反転するかもしれません。

2

質問はあまり明確ではありません。 「どのような仕組みが存在するのか」、「議論と形式の慣習は何か」、「どうやってミックスとマッチングを行うべきか」などの質問はありますか?

(少なくともUNIXの世界で)いくつかのかなりの標準的な方法があります。

  • 環境変数
  • コンフィギュレーション・ファイル上記のサブセットとして
  • コマンドライン引数
  • 、設定ファイルは、コマンドラインで指定します。

独自のプログラムで使用する方法を選択するには、多くのあなたの選択をフリーズする前に、受け入れられた練習のキャノンからのプログラムは、いくつかのブログを読んで、いくつかの本を読んで...

コンフィギュレーションファイルは、

治療はかなり複雑になる可能性があります。コマンドライン引数は、設定ファイルや環境変数の解釈に影響を与えるかもしれませんが、あなたはまだ、コマンドラインで他のメカニズムを却下したい場合は(良いアイデア)は、次の3つのパスが必要になる場合があります

  1. コマンドラインを解析し、
  2. 設定ファイルと環境変数の扱い
  3. 他のすべての設定を無効にするには、コマンドラインを再実行します。 Unixの伝統で

getoptgetopt_longを見てください。 gengetopt

環境変数を設定するシェルスクリプトにすることで、設定ファイルの問題を簡単にすることができます(しかし、これにより、UNIXモデルにロックされます)。プレーンテキストを解析するのは簡単でクロスプラットフォームですが、より多くのコードを書くことができます。標準形式とライブラリを使用すると、ユーザーのビルド環境に要件が課せられますが、バグや混乱を避ける必要があります。


コンフィギュレーション環境が複雑な場合は、必要に応じて周りに渡すことができる構造で構成状態をカプセル化することは非常に便利です。これはgengetoptのアプローチであり、私はそれが有用であることを発見しました。

+0

これは、どのようなメカニズムが存在するのですか?というのは、フォーマットに通常のキーと値のペアを使用するだけです。 –

5

セクション10のThe Art of Unix Programmingの多くは、Eric Raymond氏がカバーしています。これは明らかにUnix中心ですが、ほとんどの原則はどのOSでも適用できます。

+1

背景イメージがない場合、http://www.faqs.org/docs/artu/で読みやすくなります。 –

+0

ありがとう、ロブ。私が全部を読むと、それを見つけて欲しいです:)私のリンクを更新しました。 –

1

この領域のUnixライクなデザインパターンについては、Raymondの「Art」のUnixProgrammingを参照してください。環境変数や設定ファイルに対するコマンドライン引数の優先順位付けについて説明します。

1

Lua言語の一部は、一連のツールのための明確な構成言語を持つ必要性から動機付けられました。 Luaを設定言語として統合するのは非常に簡単です。かなり完全な例は、Programming in Luaという書籍にあります。その中の古い版はオンラインで入手できます。 Chapter 25には、Luaを設定言語として組み込むためにLua C APIを使用する方法と、これをやりたい理由が記載されています。

関連する問題