changzhiwin 发表于 2011-07-31 21:45

监听一个套接字,然后fork多个进程,提高服务器性能的问题

最近在写一个服务程序,为了提高性能,在考虑用多个进程来分担服务的压力。
1,建立一个套接字,准备监听
2,fork多个子进程,子进程accept连接,然后进行业务处理
3,主进程等待子进程结束

现在的问题是:为什么当客户端和服务端建立一个tcp连接的时候,服务端的三个子进程都得到了通知了??

PaulChanV 发表于 2011-08-01 00:18

原因是三个监听套接字在子进程中都得到继承,所以三个子进程都会得到通知。

建议在父进程中调用 accept,accept 返回一个已连接套接字,然后再 fork 一个子进程出来处理这个套接字。

代码可以大致如下:
while(1) {
        int fd = accept(listen_fd);

        int ret = fork();
        if(ret<0) {
                // Error!
        }

        if(ret > 0) {
                // Parent
                close(fd);
                continue;
        }

        if(ret == 0) {
                // Child
                close(listen_fd);
                // Serve for this connection
        }
}
当然要注意父子进程直接的关系,还有其他细节,具体可以参考 Stevens 的《Unix网络编程》

changzhiwin 发表于 2011-08-01 08:56

感谢【PaulChanV】的回复,但是这不是我想要的。服务器的套接字是用epoll来管理的,我只是想多复制几个进程来做同样的工作,据说linux支持这种功能,也据说nginx在linux下也是这么用的,至于你信不信,反正我是信了。

jeung 发表于 2011-08-01 09:10

问题描述不清楚,好像是惊群问题

changzhiwin 发表于 2011-08-01 10:20

对对对,【jeung (van@fjnu)】一语中地啊,就是这个东西,请问该怎么搞???

PaulChanV 发表于 2011-08-01 13:43

惊群呀,加个锁不就行了吗?

wenyubo_2008 发表于 2011-08-01 14:12

回复 1# changzhiwin 你是要建3个进程,然后再三个进程里建立三个连接,来处理任务吧。这个很容易啊

changzhiwin 发表于 2011-08-01 17:07

回复 7# wenyubo_2008


    就是主程序listen()后,就fork多个进程,然后由这些子进程完成accpet操作以及与之进行通信。现在的问题是当客户端来了一个连接请求后,这些fork的子进程中有多个得到了通知,这据说是惊群现象。小弟不懂啊,有木有解决办法啊

hanzhenlll 发表于 2011-08-01 17:09

epoll后 我一般的做法是 锁 + 多线程......:lol:


一直很HAPPLY

wenyubo_2008 发表于 2011-08-02 13:56

回复 9# hanzhenlll 不防,贴一个例子,大家都好学习下
页: [1] 2
查看完整版本: 监听一个套接字,然后fork多个进程,提高服务器性能的问题