C言語でprefork型のデーモンを書く(1): 非デーモン prefork サンプル
Cで書かれた prefork デーモン(daemon)のちょうど良いサンプルが見つからなかったので自分で書く。
ちょうど良いお手本がないので PerlのソースをCに移植した。
プラットフォームはCentOS5.2。
- my_prefork.c
ただの prefork のサンプル(デーモン化はしていない)
#include <stdio.h>
#include <string.h>
#include <apr_hash.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_CHILDREN 16 //子プロセスの数
int main(void){
// 子プロセスの管理にハッシュテーブルを使う
apr_pool_t* pool;
apr_hash_t* hChildren;
apr_initialize();
apr_pool_create(&pool, NULL);
hChildren = apr_hash_make(pool);
//親プロセスのループ
while(1){
while( apr_hash_count(hChildren) >= MAX_CHILDREN ){
int status;
pid_t child_pid = wait( &status ); //子プロセスが死ぬまで待つ
apr_hash_set(hChildren, &child_pid, sizeof(child_pid), NULL); //死んだ子プロセスをハッシュテーブルから削除
}
pid_t *pid = apr_palloc(pool, sizeof(pid_t));
*pid = fork(); //フォーク
if(*pid==0) goto CHILDREN; //子プロセスだったら、ループから抜ける
apr_hash_set(hChildren, pid, sizeof(pid_t), 1); //子プロセスをハッシュテーブルに追加
usleep(100);
}
CHILDREN:
while(1){
//子プロセスの処理をここに書く
sleep(1);
}
}
# gcc -g -I /usr/include/apr-1 -L/usr/lib/apr-1 -lapr-1 my_prefork.c -o my_prefork