免费注册 查看新帖 |

Chinaunix

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

如何提前终止select [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-05 11:50 |只看该作者 |倒序浏览
用select进行IO多路转接,设置了time out。
当指定的描述符还没准备好时,select阻塞,直到time out。
但,有时候,我需要当select阻塞还没time out的时候,提前跳出select函数。
如何实现?另外一个进程或者线程发送信号让select终止吗?

论坛徽章:
0
2 [报告]
发表于 2009-06-05 12:46 |只看该作者
怎么会有这么奇怪的 需求??

论坛徽章:
0
3 [报告]
发表于 2009-06-05 12:52 |只看该作者

回复 #1 greatho1507 的帖子

简单点,内部弄个pipe或者socketpair,也放到select里面去,需要中断select的话,就王这个pipe写点垃圾

评分

参与人数 1可用积分 +6 收起 理由
langue + 6 不错

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2009-06-05 13:08 |只看该作者
弄成非阻塞的,循环

论坛徽章:
0
5 [报告]
发表于 2009-06-05 14:06 |只看该作者
原帖由 drangon 于 2009-6-5 12:52 发表
简单点,内部弄个pipe或者socketpair,也放到select里面去,需要中断select的话,就王这个pipe写点垃圾


这个我也想过。但太复杂。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-08-10 06:20:00
6 [报告]
发表于 2009-06-05 14:14 |只看该作者
Close() any one fd of the set during select();

论坛徽章:
0
7 [报告]
发表于 2009-06-05 14:14 |只看该作者
原帖由 gawk 于 2009-6-5 13:08 发表
弄成非阻塞的,循环


我试过在另外一个线程,通过改变time out的值来退出正在阻塞的select,如把timeval.tv_sec=0。因为在select函数中,传入的是timval地址。看来select函数的内部机制不是我想的那么简单。

非阻塞循环也是一个方法。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-08-10 06:20:00
8 [报告]
发表于 2009-06-05 14:24 |只看该作者
新增一个fd加到select的set中,通过close()这个fd来立即中断当前的select. 这样最高效,最简洁!

论坛徽章:
0
9 [报告]
发表于 2009-06-05 14:33 |只看该作者
原帖由 antzcn 于 2009-6-5 14:24 发表
新增一个fd加到select的set中,通过close()这个fd来立即中断当前的select. 这样最高效,最简洁!



这个fd是文件描述符吗?
那么select岂不是不会阻塞了?因为这fd准备好了的几率太大了。
然后通过判断准备好的描述符不是目标描述符,循环,在调用select?
这样岂不是和非阻塞,循环一样了?

论坛徽章:
0
10 [报告]
发表于 2009-06-05 14:43 |只看该作者
原帖由 antzcn 于 2009-6-5 14:14 发表
Close() any one fd of the set during select();


不同的线程或者进程,而且是多个并发,我获取其中的fd不容易。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP