并发服务器(多进程版本)
1 int "apue.h" 2 int main() 3 { 4 int listenfd,connfd; 5 pid_t childid; 6 socklen_t len; 7 struct sockaddr_in serveraddr,clientaddr; 8 listenfd= socket(AF_INET,SOCK_STREAM,0); 9 bzero(&serveraddr,sizeof(serveraddr)); 10 serveraddr.sin_family=AF_INET; 11 serveraddr.sin_port=htons(8888); 12 serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); 13 bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); 14 listen(listenfd,10); 15 signal(SIGCHLD,sig_func); 16 while(1) 17 { 18 len=sizeof(clientaddr); 19 connfd = accept(listenfd,(struct sockaddr *)&clientaddr,&len); 20 if(connfd<0) 21 { 22 if(errno==EINTR) 23 { 24 continue; 25 } 26 else{ 27 printf("accept error"); 28 } 29 } 30 childid=fork(); 31 if(childid==0) 32 { 33 close(listenfd); 34 dowhatyouwant(); 35 exit(0); 36 } 37 close(connfd); 38 } 39 40 }
1 void sig_func(int signo) 2 { 3 pid_t pid;int stat; 4 while(waitpid(-1,&stat,WNOHANG)>0) 5 { 6 printf("child process is closed :->%d",pid); 7 } 8 return NULL; 9 }
这个服务器版本提供了accept返回EINTR错误继续执行的机制,保证了稳定性,而且其创建的子进程服务进程也会被正常的回收掉。
子进程结束会给父进程返回一个SIGCHID信号,父进程捕获到这个信号之后会执行信号处理函数,进行子进程的回收。