static int nchildren;
Static pid_t* PIDs;
int main (int argc,char**argv) {
int listenfd,i;
Socklen_t Addrlen;
void Sig_int (int);
pid_t Child_make (Int,int,int);
if (argc==3)
Listenfd=tcp_listen (Null,argv[1]), Argv[2],&addrlen);
Else
Err_quit ("Usage:server02");
Nchildren=atoi (Argv[argc-1]);
Pids=calloc (nchildren,sizeof (pid_t));
For (i=0;i<nchildren,sizeof (pid_t));
Pids[i]=child_make (I,listenfd,addrlen); Here are the parent and child processes
Signal (Sigint,sig_int);
while (1)
Pause ();
}
void Sig_int (int signo) {//wait always returns the first terminating child process
int i;
void Pr_cpu_time (void);
for (i=0;i<nchildren;i++)
Kill (Pids[i],sigterm);
while (Wait (NULL) >0)//RETUNR child PID
{}
if (errno!=echild)
Err_sys ("Wait Error");
Pr_cpu_time ();
Exit (0);
}
pid_t child_make (int i,int listenfd,int addrlen) {
pid_t pid;
void Child_main (Int,int,int);
if ((Pid=fork () >0)
return PID;
Child_main (I,listenfd,addrlen);
}
void Child_main (int i,int listenfd,int Addrlen)
{int connfd;
void Web_child (int);
Socklen_t Clilen;
struct SOCKADDR*CLIADDR;
Cliaddr=malloc (Addrlen);
while (1) {
Clien=addrlen;
Connfd=accept (Listenfd,cliaddr,&clilen);
Web_child (CONNFD);
Close (CONNFD);
}
}
Linux Process Pool Model