並發服務器(多進程版本)
阿新 • • 發佈:2017-11-17
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信號,父進程捕獲到這個信號之後會執行信號處理函數,進行子進程的回收。
並發服務器(多進程版本)