zoukankan      html  css  js  c++  java
  • 并发服务器(多进程版本)

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

  • 相关阅读:
    AFO
    【WC2016】鏖战表达式
    CF 构造
    noi2020 补题
    min_25筛
    退役公告
    arthas使用
    Python 分布式缓存之Reids数据类型操作详解
    python安装读取grib库总结(推荐)
    使用python修改文件并立即写回到原始位置操作(inplace读写)
  • 原文地址:https://www.cnblogs.com/coversky/p/7852942.html
Copyright © 2011-2022 走看看