#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#include <boss.h>
/* 子进程数量 */
int forkflag;
int _chldcnt;
int RequestAnalyze()
{
return(0);
}
/* main function of children process */
int process()
{
return(0);
}
/* initialization of share parameters */
int parentinit()
{
_chldcnt = 3;
return(0);
}
/* initialization of process only */
int childinit()
{
return(0);
}
int childfinal()
{
sleep(5);
return 0;
}
/**********************************************************/
/* 固定进程控制模块 */
/**********************************************************/
void sig_quit(int signo)
{
_exit(0);
}
void sig_exit(int signo)
{
kill(0, 15);
_exit(0);
}
void sig_chld(int signo)
{
pid_t pid;
int stats, i;
while ( (pid = waitpid(-1, &stats, WNOHANG)) > 0) {
CheckError("child %d terminated.\n", pid);
for (i = 0; i < _chldcnt; i++)
if (mychld[i].pid == pid) {
mychld[i].flag = 1;
forkflag = 1;
break;
}
}
}
int chlidrun(char bid)
{
bankid = bid;
signal(SIGTERM, sig_quit);
if (childinit()) CheckError("childinit error !!!\n");
else if (process()) {
CheckError("process error !!!\n");
sleep(1);
}
childfinal();
_exit(0);
}
int prginit(int argc, char **argv)
{
if (parentinit()) exit(-1);
signal(SIGCLD, SIG_IGN);
signal(SIGCHLD, sig_chld);
signal(SIGTERM, sig_exit);
return(0);
}
void newchild()
{
int pid, i;
signal(SIGCHLD, sig_chld);
for (i = 0; i < _chldcnt; i++) {
if (mychld[i].flag) {
pid = fork();
if (pid > 0) {
mychld[i].pid = pid;
mychld[i].flag = 0;
}
else if (pid == 0)
chlidrun(mychld[i].bankid);
else {
i--;
sleep(3);
}
}
}
forkflag = 0;
}
int main(int argc, char **argv)
{
int i, pid;
if (argc != 3) {
fprintf(stdout, "Usage: %s <config> <tracefile>\n",
argv[0]);
return(-1);
}
setpgrp();
prginit(argc, argv);
/* children fork */
for (i = 0; i < _chldcnt; i++) {
pid = fork();
if (pid > 0) {
mychld[i].pid = pid;
mychld[i].flag = 0;
}
else if (pid == 0)
chlidrun(mychld[i].bankid);
else {
i--;
sleep(3);
}
usleep(100000);
}
forkflag = 0;
/* children management */
signal(SIGCHLD, sig_chld);
while(1) {
if (forkflag)
newchild();
sleep(3);
}
return(0);
}