注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

勇敢的劳尤条

 
 
 

日志

 
 

如何将recvfrom从阻塞状态唤醒  

2013-10-25 15:03:44|  分类: 网络编程知识积累 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我写了一个服务器,基本模型:一个阻塞接受线程+任务队列+线程池。
现在的问题是不知如何让程序正常退出。
1)我写了一个退出线程,当接收到用户输入q时,那么进行清理工作,关闭线程池,退出所以线程,但是那个阻塞接收的线程却一直阻塞在那里,造成资源浪费,每次都是kill或者ctrl+C,相当不爽。
2)后来查了一些资料,如何让recvfrom从阻塞状态唤醒,并继续执行呢?
答案是:释放监听的fd,这个是最简单的方法,但是有一点要注意,就是close(fd)系统调用无效,必须要使用shutdown(fd, SHUT_RDWR)来将recvfrom唤醒,因为close只关闭写通道,recvfrom在fd的写通道等待列表中,只要关闭写通道时才会将recvfrom阻塞唤醒。

当然啦,也有其他做法,但是有些不符合本服务器的需求。
 在调用recvfrom前将recvfrom的fd设置一个超时,这个超时时间较难设置,但比较简单,也容易实现
 在调用recvfrom前将recvfrom的fd设置为非阻塞的,这个方法容易导致循环过快,CPU使用率上升
 使用select/epoll来接收,
 fake一个消息包发给这个相应的端口
 pthread_cancel强制杀掉线程

  评论这张
 
阅读(233)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017