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