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

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

转载于:https://www.cnblogs.com/coversky/p/7852942.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值