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

Posted CoverSky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发服务器(多进程版本)相关的知识,希望对你有一定的参考价值。

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

以上是关于并发服务器(多进程版本)的主要内容,如果未能解决你的问题,请参考以下文章

多个请求是多线程吗

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

多进程多线程并发服务器代码

golang代码片段(摘抄)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

php socket多进程简单服务器