ソフトな忘却力(2) ラズパイ4でCプログラミング、libconfig

Joseph Halfmoon

前回はコマンドラインオプションの取得用ライブラリ getopt でした。今回は、ファイルに書き込まれたコンフィギュレーション設定を読み取るための libconfigを使ってみます。最近私はPythonではJSON形式使っていますが、libconfigも分かり易いのではないかと。勿論、読み書き両対応。C/C++にも両対応。

(前回はラズパイ3で実習?でしたが、今回はラズパイ4です。まあラズパイでも他のLinuxでもきっと変わりませんが。)

以下に、libconfig のメンテナンスをしておられる Mark Lindner氏(hyperrealm) による libconfigのページへのリンクを貼り付けておきます。

libconfig, C/C++ library for processing configuration files 

XMLやJSON同様、構造化された記述方法のコンフィギュレーション・ファイル(テキスト・ファイル)を読み取って、文字列でも数値でも設定値を読み取り、あるいは設定してファイルに書き戻しもできるライブラリです。でもま、簡単には、

A = B;

式の行を読み取ってAという名のコンフィギュレーションの設定値はB、などと使うのが一番ありじゃないかとおもいます。

インストレーション

CでもC++でも使えるライブラリなのですが、Raspberry Pi OS<32bit>(昔のRaspbian OS)上では、C用とC++用のパッケージがレポジトリに準備されているようでした。

  • libconfig++-dev
  • libconfig-dev

こちらでは C言語で古臭くやっているのでC用選択します。ラズパイ上へ開発用のファイル類一式インストールする場合は以下でOKです。

$ sudo apt install libconfig-dev

 

コンフィグレーションファイル simple.cfg

公式ドキュメントを読んでいただければわかりますが、階層構造を持ち、ArrayとかListとか構造をもったデータのカッコいいコンフィギュレーション・ファイルを利用可能です。しかし今回は、最低線にシンプルな以下のファイルを使用したいと思います。名前=値;という形のみ。私はこんな形式で10~20行もあれば、十分なことが多いです。

a_setting = "ASETTING";
b_setting = 133;

 

Cソース simple.Config.c

キメウチのファイル名で、エラー表示とか無の、2要素取り出しのみのシンプルな利用例であります。一応文字列取り出しと数値取り出しあり。

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

int main(int argc, char **argv)
{
  config_t cfg;
  const char *str;
  int ival;

  config_init(&cfg);
  if (!config_read_file(&cfg, "simple.cfg")) {
    return(EXIT_FAILURE);
  };

  if(config_lookup_string(&cfg, "a_setting", &str)) {
    printf("a_setting: %s\r\n", str);
  }

  if(config_lookup_int(&cfg, "b_setting", &ival)) {
    printf("b_setting: %d\r\n", ival);
  }

  config_destroy(&cfg);
  return(EXIT_SUCCESS);
}

 

ビルド

特に何もありません、リンクするライブラリに -lconfig 指定するだけ。

$ gcc simpleConfig.c -o simpleConfig -lconfig

 

実行結果

コンフィギュレーションファイルに書いてある内容が「ちゃんと」読み取られていました。

$ ./simpleConfig
a_setting: ASETTING
b_setting: 133

ライブラリの海は広大、次はどこへ行こうか?

ソフトな忘却力(1) リモート接続でLinux Cプログラミング getopt に戻る