请教select超时时间函数等待超时的问题

linux(39)
如果select调用中设置了等待时间,那么每次调用时都需要重新对这个时间赋值么?就像对fd_set处理一样。&
while(1) {&
& FD_ZERO(&readfd);&
& FD_SET(fd, &readfd);&
& tv.tv_sec = 2;&
& tv.tv_usec = 0;&
& select(maxfd+1, &readfd, NULL, NULL, &tv);&
& ......;&
如上代码,对fd_set需要每次调用都要重新设置,那么对tv来说是否也是一样呢?能不能把对tv的赋值放在while外面?
-------------------------------
之外意思就变了。
------------------------------
传的是一个引用进去,select里面可能会改变这个地址里保存的内容。所以每次循环都必须重新赋值
------------------------------
如楼主将时间的初始化放在外边,时间初始化为2秒,假设在1秒后发上了事件,则select将会返回并将tv的时间变成上次阻塞的剩余时间,即1秒,然后再进行监视套接字。这是因为linux系统对select()的实现中会修改参数tv为剩余时间。所以在循环内部使用函数select的时候一定要在循环内部初始化时间参数。
==================================================================
所以对于select函数中的最后一个参数,需要在循环中设置,每次循环要重新设置。如果设在循环外面,当循环执行起来后,每次循环select都会修改tv的值,tv的值越来越小,导致最后会产生select函数这tv时间内收不到有效时间,而返回-1,造成错误。
==================================================================
在网络程序中,一个进程同时处理多个文件描述符是很常见的情况。select()系统调用可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select()阻塞,其中任一设备准备好时,select()就返回。
&&& 这个函数真是神通广大,用来定时也不错。select(0, NULL, NULL, NULL, &tv);&tv在每次执行select前都要重新设定一遍,不然就变成0了。感觉它的精度比usleep()要高一些。
select()的调用形式为:
&&& #include &sys/select.h&
&&& #include &sys/time.h&
&&& int&select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout);
&&&&select的第一个参数是文件描述符集中要被检测的比特数,这个值必须至少比待检测的最大文件描述符大1;参数readfds指定了被读监控的文件描述符集;参数writefds指定了被写监控的文件描述符集;而参数exceptfds指定了被例外条件监控的文件描述符集。
&&& 参数timeout起了定时器的作用:到了指定的时间,无论是否有设备准备好,都返回调用。timeval的结构定义如下:
&&& struct timeval{
&&& &&& long tv_ //秒
&&& &&& long tv_ //微秒
&&& timeout取不同的值,该调用就表现不同的性质:
&&& timeout为0,调用立即返回;
&&& timeout为NULL,select()调用就阻塞,直到知道有文件描述符就绪;
&&& timeout为正整数,就是一般的定时器。
&&&&select调用返回时,除了那些已经就绪的描述符外,select将清除readfds、writefds和exceptfds中的所有没有就绪的描述符。select的返回值有如下情况:
&&& 正常情况下返回就绪的文件描述符个数;
&&& 经过了timeout时长后仍无设备准备好,返回值为0;
&&& 如果select被某个信号中断,它将返回-1并设置errno为EINTR。
&&& 如果出错,返回-1并设置相应的errno。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:42645次
排名:千里之外
转载:107篇
(1)(13)(6)(1)(6)(1)(10)(1)(9)(3)(3)(2)(1)(5)(7)(5)(4)(5)(8)(13)(19)(5)windows下利用select函数等待键盘输入解决方案 - C++当前位置:& &&&windows下利用select函数等待键盘输入解决方案windows下利用select函数等待键盘输入解决方案&&网友分享于:&&浏览:142次windows下利用select函数等待键盘输入#include&iostream&#include &Winsock2.h&#pragma comment(lib,&ws2_32.lib&)#define STDIN 0void main(){
tm.tv_sec=20; tm.tv_usec=0; fd_ FD_ZERO(&readfds); FD_SET(STDIN,&readfds); select(STDIN+1,&readfds,NULL,NULL,&tm); &
if(!FD_SET(STDIN,&readfds)){
cout&&&time out&&& &
} else { &
cout&&&a key was pressed&&& &
}}这个程序始终输出&a key was pressed&我想问FD_ISSET这个宏不是只有描述字中STDIN有输入的时候才返回正数的吗为什么键盘没有输入也返回正数的求大侠解释------解决方案--------------------
windows和linux怎么那么像。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
本帖子已过去太久远了,不再提供回复功能。Linux下select()中的timeout的设置与不设置问题_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Linux下select()中的timeout的设置与不设置问题
来源:Linux社区&
作者:xbl1986
Linux下的select,注意咯,不是pselect。
select()函数的最后一个参数是timeout,用来设置超时用的。
用的是一个struct timeval结构,需要用到sys/time.h文件。
struct timeval {
&long tv_ 秒
&long tv_ 毫毛
设置了timeout的值之后呢,select在没有文件描述符监视可用的情况下,会等待这个timeout的时间,时间到了select返回0
如果timeout超时之前有文件描述符可用,则返回可用的数量,这时候的timeout则会依然计数,因此如果想要每次都超时一定的时间那么在slelect返回&0的值之后要重新装填timeout的值一次。以保证超时时间没有变化。
如果tv_sec和tv_usec都是0,那么就是超时时间为0,那么select就会立刻返回了。
如果timeout这里是个NULL,那么超时就未被启用,会一直阻塞在监视文件描述符的地方。
在pselect中的timeout更牛X
用到了struct timespec {
&long tv_ 秒
&long tv_ 纳秒
时间更精确。
当然了系统做不了这么精确的事情,一般Linux的系统精度也就是10ms左右了。
这里说的重点在于timeout的值的选择和处理上。
另外遇到的一个问题是信号SIGALRM会使得select返回-1并置errno为EINTR。但这个信号已经被我的sigaction干掉了函数处理了,这个问题还需要研究一下。
相关资讯 & & &
& (07/28/:23)
& (11/03/:38)
& (06/06/:40)
& (01/28/:00)
& (10/07/:52)
& (05/15/:55)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 select函数检查读超时 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信