免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1978 | 回复: 2
打印 上一主题 下一主题

[C] 从消息队列中获取pollfd无法正常使用。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-30 12:58 |只看该作者 |倒序浏览
linux 下使用socket并发多进程处理遇到的问题?
流程如下:
1.使用poll,因为poll在linux/unix可以使用。
2.建立结构体{工作组编号,连接数量}
3.建立一个消息队列{消息类型-工作组编号, pollfd结构体}
4.将接收到的客户端连接后获取当前所有工作组中连接数量最少的工作组编号作为msgtype+客户端句柄写入到消息队列中。
5.判断工作组进程是否开启,如没有开启进程,则开启进程池。每个子进程从消息队列中获取对应工作组编号的消息取得客户端连接句柄。并将句柄保存到struct pollfd 数组中。
6.poll检查pollfd数组中fd的状态来进行接受发送处理。
--------------------------------------------------------------------------------------------------------------------------
为何使用消息队列传客户端连接,众所周知poll与select的差别在于打开文件句柄数量的限制,其他都是通过轮询fd的句柄,效率不高,所以开启进程池,进程池中的进程poll接受到的客户端连接句柄。这样可以将所有客户端句柄的检查操作由多个子进程来单独poll.提高处理效率。
那么问题来了,现在从子进程中只能取得pollfd数组中的一个句柄的状态。多于的无法取得?

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
2 [报告]
发表于 2016-02-01 11:18 |只看该作者
你的描述看起来有一些混乱....   

从你的标题看 “从消息队列中获取pollfd无法正常使用“  感觉有点问题,无论是什么FD  其实也就是一个u32的系统唯一数值,
如果这个FD无法使用 多半是检测判断出了问题。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
3 [报告]
发表于 2016-02-01 11:34 |只看该作者
你的描述看起来有一些混乱....

如果我没理解错的话是想传"客户端句柄给另一个进程"? 句柄是windows的说法, 我理解成连接的fd, 对否?
答案是fd不能跨进程传送(fork出的子进程不算传送).

可替代方案是惊群模型. 创建socket后, fork出N个进程, 同时accept, 谁抢到谁干活.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP