Cでサーバー監視のプログラムを作ってみよう その1

4/20 すいません、参考サイトが抜けていたので追記しました。

盛大な勘違い

今回からタイトル通りの事を初めてみようと思います。思いますが、まだ前段階のところにいます。構想を練りながら下地になるプログラムを作っていると、あれ?これforkにする意味なくないか?とか、これただのループじゃないか?などの問題にぶち当たって、まだまだ進めてません。

ただ作りたいものができたので、前進はできると思うのでがんばる。

ってことで、やはり毎度のごとく参考サイトを漁ってるわけですが、子プロセスの監視にはハッシュテーブルが良いよというので、ハッシュテーブルをちょっとさわってみたいと思うのですが、ハッシュテーブルを使うと効率がいいっていろんなサイトに書いてあるんだけども、たけけんはハッシュテーブル=ハッシュ値と思ってしまっていて

MD5 cddb2b1673121b9b889f41b0b474c61b ← 頭の中ではこれが出ていたので、文字の羅列を使うと効率がいいってのはなぜなぜなーに? だったのだ。

プログラムをよく触ってみると、連想配列だった。バカすぎ(笑)
Cでは連想配列は使えないので、連想配列の勉強をしたときはPHPでやってみたりしていたけど、Cでも使えるようにできるみたい。

サンプルソースを流用してちょこっと作ってみました。ハッシュはaprを使っています。
簡単に流れを掴みたかったので上から下にだけ進むように記述してます。
ごくごく基本的な連想配列になっています。

そーす

#include <stdio.h>
#include <string.h> /* strcpy( ) strcmp( ) に必要 */
#include <apr_hash.h>

/* INCLUDE: apr_hash.h
 * apr_hash_make / apr_hash_set / apr_hash_get /
 * apr_hash_count / apr_hash_first / apr_hash_next /
 * apr_hash_this */

/* ハッシュテーブルの例
 * HASHTABLE: apr_hash_make / apr_hash_set / apr_hash_get /
 * apr_hash_count / apr_hash_first / apr_hash_next / apr_hash_this */

static apr_pool_t *pool = NULL;
static apr_hash_t *hash = NULL;

int main(void)
{
 //APRを初期化する。
 apr_initialize();

 //メモリプールを作成
 apr_pool_create(&pool, NULL);

 //ハッシュを作成する。
 hash = apr_hash_make(pool);

 //要素を追加
 apr_hash_set(hash, "りんご", APR_HASH_KEY_STRING, "120円");
 apr_hash_set(hash, "ふじ", APR_HASH_KEY_STRING, "256円");
 apr_hash_set(hash, "つがる", APR_HASH_KEY_STRING, "329円");

 ////キーを指定して内容を出力
 printf("key = %s val = %s \n", "りんご", (char*)apr_hash_get(hash, "りんご", APR_HASH_KEY_STRING));

 //ハッシュの内容を出力
 apr_hash_index_t *hash_index = NULL;
 const void *key = NULL;
 void *val = NULL;

 printf("要素数[%d]\n", apr_hash_count(hash));

 //内容を出力
 hash_index = apr_hash_first(pool, hash);
 while(hash_index){
 apr_hash_this(hash_index, &key, NULL, &val);
 printf("key = %s, val = %s \n", (char*)key, (char*)val);
 hash_index = apr_hash_next(hash_index);
 }

 //要素を変更してみる
 apr_hash_set(hash, "つがる", APR_HASH_KEY_STRING, "790円");

 //出力してみる
 printf("要素数[%d]\n", apr_hash_count(hash));

 //内容を出力
 hash_index = apr_hash_first(pool, hash);
 while(hash_index){
 apr_hash_this(hash_index, &key, NULL, &val);
 printf("key = %s, val = %s \n", (char*)key, (char*)val);
 hash_index = apr_hash_next(hash_index);
 }

 //要素を追加してみる
 apr_hash_set(hash, "ほくと", APR_HASH_KEY_STRING, "435円");

 //出力してみる
 printf("要素数[%d]\n", apr_hash_count(hash));

 //内容を出力
 hash_index = apr_hash_first(pool, hash);
 while(hash_index){
 apr_hash_this(hash_index, &key, NULL, &val);
 printf("key = %s, val = %s \n", (char*)key, (char*)val);
 hash_index = apr_hash_next(hash_index);
 }

 apr_terminate();

 return 0;
}

実行結果

# ./hash_3
key = りんご val = 120円
要素数[3]
key = ふじ, val = 256円
key = つがる, val = 329円
key = りんご, val = 120円
要素数[3]
key = ふじ, val = 256円
key = つがる, val = 790円
key = りんご, val = 120円
要素数[4]
key = ふじ, val = 256円
key = つがる, val = 790円
key = ほくと, val = 435円
key = りんご, val = 120円

こんな感じになりました。

 

今回の監視プログラムを作ろうと思った経緯

話が変わりますが、いつでもどこでもプログラムいじりをするために、あらたにVPSを1個追加で借りてだしてOSをFreeBSDにしていたんだけど、今回のapr-develが使える状態にできなくて、結局ローカルのCentOSでテストしていました。

んで、今回の経緯ですが今サーバーで使っている自前のLoadAverage監視のスクリプトをDaemon化してみようと思ったのがきっかけなんだが、せっかくforkを使うんだったら、KVMを使って複数のVMを見れるようにしたらおもろいんじゃないかと、なので自宅サーバーにVPSを作ってそこでテストしようという事になりました。

レンタルVPSさよなら。

頭での構想の段階でイメージ通りに動いてないんですけど、まぁがんまります。
トライするものが見つかって、ブログをやりだした初期にもどったみたいでなんだかワクテカでござる。

昔作ってたKVM機は今はWindows機になっているので、まだ作り直さないといかん。。。

参考サイト

kurukuru-papaのブログ  ハッシュテーブルを使ってみる

yoshifumi1975’s diary  Cでハッシュテーブルを使うときのメモ

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *