1. 程式人生 > >並發服務器(多進程版本)

並發服務器(多進程版本)

while conn struct () socket chl ces turn truct

 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信號,父進程捕獲到這個信號之後會執行信號處理函數,進行子進程的回收。

並發服務器(多進程版本)