监听一个套接字,然后fork多个进程,提高服务器性能的问题
最近在写一个服务程序,为了提高性能,在考虑用多个进程来分担服务的压力。1,建立一个套接字,准备监听
2,fork多个子进程,子进程accept连接,然后进行业务处理
3,主进程等待子进程结束
现在的问题是:为什么当客户端和服务端建立一个tcp连接的时候,服务端的三个子进程都得到了通知了?? 原因是三个监听套接字在子进程中都得到继承,所以三个子进程都会得到通知。
建议在父进程中调用 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网络编程》 感谢【PaulChanV】的回复,但是这不是我想要的。服务器的套接字是用epoll来管理的,我只是想多复制几个进程来做同样的工作,据说linux支持这种功能,也据说nginx在linux下也是这么用的,至于你信不信,反正我是信了。 问题描述不清楚,好像是惊群问题 对对对,【jeung (van@fjnu)】一语中地啊,就是这个东西,请问该怎么搞??? 惊群呀,加个锁不就行了吗? 回复 1# changzhiwin 你是要建3个进程,然后再三个进程里建立三个连接,来处理任务吧。这个很容易啊 回复 7# wenyubo_2008
就是主程序listen()后,就fork多个进程,然后由这些子进程完成accpet操作以及与之进行通信。现在的问题是当客户端来了一个连接请求后,这些fork的子进程中有多个得到了通知,这据说是惊群现象。小弟不懂啊,有木有解决办法啊 epoll后 我一般的做法是 锁 + 多线程......:lol:
一直很HAPPLY 回复 9# hanzhenlll 不防,贴一个例子,大家都好学习下
页:
[1]
2