【Linux】多进程实现并发服务器

多进程实现并发服务器

1.此时来一个客户端请求时 创建cfd1 属于是阻塞状态 如果再有一个客户端就没办法提取了

 

2.所以要fork一个子进程,此时关闭父进程的cfd1,关闭子进程的lfd;不影响其它客户端请求连接

 

具体流程:

  • 创建套接字

  • 绑定

  • 监听

  • while(1)

{

提取连接

fork创建子进程

子进程中,关闭lfd,服务客户端

父进程关闭cfd,回收子进程的资源(用信号来回收)

}

关闭

具体代码:

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include "wrap.h"
void free_process(int sig)
{
    pid_t pid;
    while(1)
    {
        pid = waitpid(-1,NULL,WNOHANG);
        if(pid <=0 )//小于0 子进程全部退出了 =0没有进程没有退出
        {
            break;
        }
        else
        {
            printf("child pid =%d\n",pid);
        }
    }

}
int main(int argc, char *argv[])
{
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set,SIGCHLD);
    sigprocmask(SIG_BLOCK,&set,NULL);
    //创建套接字,绑定
    int lfd = tcp4bind(8008,NULL);
    //监听
    Listen(lfd,128);
    //提取
    //回射
    struct sockaddr_in cliaddr;
    socklen_t len = sizeof(cliaddr);
    while(1)
    {
        char ip[16]="";
        //提取连接,
        int cfd = Accept(lfd,(struct sockaddr *)&cliaddr,&len);
        printf("new client ip=%s port=%d\n",inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,ip,16),
                ntohs(cliaddr.sin_port));
        //fork创建子进程
        pid_t pid;
        pid = fork();
        if(pid < 0)
        {
            perror("");
            exit(0);
        }
        else if(pid == 0)//子进程
        {
            //关闭lfd
            close(lfd);
            while(1)
            {
            char buf[1024]="";

            int n = read(cfd,buf,sizeof(buf));
            if(n < 0)
            {
                perror("");
                close(cfd);
                exit(0);
            }
            else if(n == 0)//对方关闭j
            {
                printf("client close\n");
                close(cfd);
                exit(0);
            
            }
            else//读到发来的数据了
            {
                printf("%s\n",buf);
                write(cfd,buf,n);
            //    exit(0);    
            }
            }
        
        }
        else//父进程
        {
            close(cfd);
            //回收
            //注册信号回调
            struct sigaction act;
            act.sa_flags =0;
            act.sa_handler = free_process;
            sigemptyset(&act.sa_mask);
            sigaction(SIGCHLD,&act,NULL);
            sigprocmask(SIG_UNBLOCK,&set,NULL);
        
        }
    }
    //关闭

    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值