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