一种增强型Linux选择器及其处理方法

文档序号:8339455阅读:131来源:国知局
一种增强型Linux选择器及其处理方法
【技术领域】
[0001]本发明涉及网络设备,特别涉及一种增强型Linux选择器及其处理方法。
【背景技术】
[0002]Linux程序中处理事件的方式主要有两种,即轮询和触发,采用轮询方式的话需要程序不停运转,会产生很多的空操作;而采用触发方式的话,程序只要将所关注的事件注册到Select函数(选择函数)中,当事件发生时,会自动触发该事件的处理函数。当没有事件发生时,进程会进入到休眠模式,这样极大地节约了 CPU的资源,对于嵌入式设备而言,这样还可以节约电量。因此,Linux中Select函数是一个应用非常广泛的函数。
[0003]Linux中的Select函数属于系统调用函数,具体实现是在驱动程序中,其基本运行流程图如图1所不:
Al.初始化FD_SET,这是一个socket套接字集合,在这一步将所有要关注的套接字都加入到FD_SET中;
A2.初始化定时器;
A3.Select函数轮询所有的FD_SET和定时器;
A4.若有FD事件发生,即有套接字有数据,则处理FD事件,然后将定时器清零;
A5.若有定时器超时,则处理定时器事件。
[0004]所述Select 函数的原型是:int select (int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval 氺timeout)。其中,maxfdp 是最大监听描述符,readfds是读描述符集合,writefds是写描述符集合,errorfds是错误描述符集合,timeout是定时器超时时间。
[0005]Select函数中的定时器,如果没有任何事件发生,到达timeout设定的超时时间后,将触发Select函数返回;如果有事件发生,则定时器会被清零。也就是说,这里的定时器只能记录读写事件的超时,而不能用于普通的定时功能。然而,这种在处理事件时将定时器清零的机制,在某些场合下是有用的,但是在很多场合又会带来很多麻烦。

【发明内容】

[0006]本发明的目的在于提供一种增强型Linux选择器及其处理方法,完善Linux中Select函数对定时器的支持,增强了定时功能。
[0007]为了达到上述目的,本发明的一个技术方案是提供一种增强型Linux选择器的处理方法,其中包含以下过程:
初始化套接字集合,将所有要关注的套接字加入到套接字集合中;
初始化定时器,并初始化定时器类型标记为第一数值,表示定时器为不可清除的定时器;
轮询所有的套接字集合和定时器;
当有事件发生而使被关注的套接字有数据时,处理事件,并且不将定时器超时时间清零。
[0008]优选地,若初始化定时器类型标记为第二数值的,表示定时器为可清除的定时器,则当有事件发生并处理该事件之后,将定时器超时时间清零。
[0009]优选地,当有事件发生并处理该事件之后,通过判断定时器类型标记为第二数值或第一数值,来确定定时器是否为可清除的定时器,进而确定是否执行将定时器超时时间清零的操作。
[0010]优选地,轮询所有的套接字集合和定时器时,若没有事件发生而有定时器超时的,则处理定时器事件。
[0011]本发明的另一个技术方案是提供一种增强型Linux选择器,其中设置有ESelect函数,在其中注册所关注的事件,以便在轮询过程发生事件时自动触发该事件的处理函数;并且,所述ESelect函数中的一个参数,对应于轮询过程中无论是否有事件发生定时器都不会被清零的操作。
[0012]优选地,所述ESelect函数设定有定时器类型标记;该定时器类型标记的第一数值,对应于事件处理时不执行定时器清零的操作;该定时器类型标记的第二数值,对应于事件处理时执行定时器清零的操作。
[0013]优选地,所述ESelect函数还包含最大监听描述符、读描述符集合,写描述符集合,错误描述符集合,以及定时器超时时间。
[0014]本发明提供一种增强型Linux选择器及其处理方法,解决了传统Select函数对定时器支持不够好的问题;本发明通过增加ESelect函数,提高了选择器的定时功能;通过标记定时器类型,可以选择开启或关闭该定时功能。
【附图说明】
[0015]图1是传统Linux下Select函数的处理流程图;
图2是本发明中改进后的ESelect函数的处理流程图。
【具体实施方式】
[0016]本发明所述增强型Linux选择器,对传统的Select函数进行一次封装,记为 ESelect 函数,其原型为:int eselect (int maxfdp, fd_set *readfds, fd_set*writefds, fd_set *errorfds, struct timeval ^timeout, int timeoutFlag)。
[0017]其中,timeoutFlag用于标记定时器的类型,如果timeoutFlag=0,则表示兼容传统的Select函数,其行为等价于传统的Select函数。如果timeoutFlag=l,则表示该定时器为不可被清除的定时器,不管有没有读写事件发生,该定时器都不会被清零。
[0018]其他参数含义与传统Select函数中的一致,S卩,maxfdp是最大监听描述符,readfds是读描述符集合,writefds是写描述符集合,errorfds是错误描述符集合,timeout是定时器超时时间。
[0019]本发明所述ESelect函数的处理流程图,如图2所示:
B1.初始化socket套接字集合FD_SET,将所有要关注的套接字都加入到FD_SET中; B2.初始化定时器;
B3.初始化定时器类型标记timeoutFlag ; B4.轮询所有的FD_SET和定时器,根据结果执行B5或B9 ;
B5.若有FD事件发生,S卩,被关注的套接字有数据,则处理H)事件;
B6.判断定时器类型标记timeoutFlag,根据结果执行B7或B8 ;
B7.如果定时器类型标记timeoutFlag为True (真),表示timeoutFlag=0,则按照传统Select函数方式将定时器清零,即,将定时器超时时间timeout清零;
B8.如果定时器类型标记timeoutFlag为False (假),表示timeoutFlag=l,为不可被清除的定时器,则定时器超时时间timeout不清零;
B9.在B4时如果有定时器超时,则处理定时器事件;
B10.经Β7、Β8或Β9完成一次事件处理后,触发返回Β4进行下一次轮询。
[0020]综上所述,本发明提供一种增强型Linux选择器及其处理方法,通过增加ESelect函数,提高了选择器的定时功能;通过标记定时器类型,可以选择开启或关闭该定时功能。
[0021]尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。
【主权项】
1.一种增强型Linux选择器的处理方法,其特征在于,包含以下过程: 初始化套接字集合,将所有要关注的套接字加入到套接字集合中; 初始化定时器,并初始化定时器类型标记为第一数值,表示定时器为不可清除的定时器; 轮询所有的套接字集合和定时器; 当有事件发生而使被关注的套接字有数据时,处理事件,并且不将定时器超时时间清零。
2.如权利要求1所述增强型Linux选择器的处理方法,其特征在于, 若初始化定时器类型标记为第二数值的,表示定时器为可清除的定时器,则当有事件发生并处理该事件之后,将定时器超时时间清零。
3.如权利要求2所述增强型Linux选择器的处理方法,其特征在于, 当有事件发生并处理该事件之后,通过判断定时器类型标记为第二数值或第一数值,来确定定时器是否为可清除的定时器,进而确定是否执行将定时器超时时间清零的操作。
4.如权利要求1所述增强型Linux选择器的处理方法,其特征在于, 轮询所有的套接字集合和定时器时,若没有事件发生而有定时器超时的,则处理定时器事件。
5.—种增强型Linux选择器,其特征在于, 设置有ESelect函数,在其中注册所关注的事件,以便在轮询过程发生事件时自动触发该事件的处理函数; 并且,所述ESelect函数中的一个参数,对应于轮询过程中无论是否有事件发生定时器都不会被清零的操作。
6.如权利要求5所述的增强型Linux选择器,其特征在于, 所述ESelect函数设定有定时器类型标记; 该定时器类型标记的第一数值,对应于事件处理时不执行定时器清零的操作; 该定时器类型标记的第二数值,对应于事件处理时执行定时器清零的操作。
7.如权利要求6所述的增强型Linux选择器,其特征在于, 所述ESelect函数还包含最大监听描述符、读描述符集合,写描述符集合,错误描述符集合,以及定时器超时时间。
【专利摘要】本发明涉及一种增强型Linux选择器及其处理方法,设置有ESelect函数,在其中注册所关注的事件,以便在轮询过程发生事件时自动触发该事件的处理函数;并且,通过设置所述ESelect函数中的一个参数,使得轮询过程中无论是否有事件发生,定时器都不会被清零。本发明解决了传统Select函数对定时器支持不够的问题;本发明通过提高了选择器的定时功能,并能够通过标记定时器类型,选择开启或关闭该定时功能。
【IPC分类】G06F9-46
【公开号】CN104657208
【申请号】CN201510118465
【发明人】张伟
【申请人】上海斐讯数据通信技术有限公司
【公开日】2015年5月27日
【申请日】2015年3月18日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1