并发服务器(多进程版本)

 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信号,父进程捕获到这个信号之后会执行信号处理函数,进行子进程的回收。

posted @ 2017-11-17 18:39  颜小雀  阅读(203)  评论(0编辑  收藏  举报