关于Linux下一个小程序中select()函数的问题,这个程序中select到底执行了几次?
代码如下,该程序中以标注输入(STDIN)作为文件描述符,然后调用select函数,一共调用了三次,按说应该执行三次,比如说我每次都不输入,那么执行顺序应该是:等待2秒-...
代码如下,该程序中以标注输入(STDIN)作为文件描述符,然后调用select函数,一共调用了三次,按说应该执行三次,比如说我每次都不输入,那么执行顺序应该是:等待2秒->输出time out->等待2秒->输出time out1->等待2秒->输出time out2。但实际执行时是这样的:等待2秒->输出time out->输出time out1->输出time out2。这是为什么呢?另外如果我在等待期间按一个按键,执行结果也是第一次执行,第2、3次不执行。希望高人能点拨我一下,谢谢!
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
#define STDIN 0
int main(int argc,char *argv[])
{
struct timeval tv;
fd_set readfds;
tv.tv_sec=2;
tv.tv_usec=0;
FD_ZERO(&readfds);
FD_SET(STDIN,&readfds);
select(STDIN+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(STDIN,&readfds))
printf("a key was pressed!");
else printf("time out");
FD_ZERO(&readfds);
FD_SET(STDIN,&readfds);
select(STDIN+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(STDIN,&readfds))
printf("a key was pressed!1");
else printf("time out1");
FD_ZERO(&readfds);
FD_SET(STDIN,&readfds);
select(STDIN+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(STDIN,&readfds))
printf("a key was pressed!2");
else printf("time out2");
return 0;
}
"ddeeic"你好,这里面不涉及多线程的东西,我只是想在主程序中测试一下select怎么用的,结果跟预想的不一样,代码都在这里了。。。 展开
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
#define STDIN 0
int main(int argc,char *argv[])
{
struct timeval tv;
fd_set readfds;
tv.tv_sec=2;
tv.tv_usec=0;
FD_ZERO(&readfds);
FD_SET(STDIN,&readfds);
select(STDIN+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(STDIN,&readfds))
printf("a key was pressed!");
else printf("time out");
FD_ZERO(&readfds);
FD_SET(STDIN,&readfds);
select(STDIN+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(STDIN,&readfds))
printf("a key was pressed!1");
else printf("time out1");
FD_ZERO(&readfds);
FD_SET(STDIN,&readfds);
select(STDIN+1,&readfds,NULL,NULL,&tv);
if(FD_ISSET(STDIN,&readfds))
printf("a key was pressed!2");
else printf("time out2");
return 0;
}
"ddeeic"你好,这里面不涉及多线程的东西,我只是想在主程序中测试一下select怎么用的,结果跟预想的不一样,代码都在这里了。。。 展开
4个回答
展开全部
原因很简单。
因为,你按下一个键之后,缓冲区里面有数据了,也就是说,stdin已经发生了一个事件,就是有数据来了。
你一直没有对缓冲区做任何操作,因此stdin一直保持着有数据的状态。
如果你在个select返回之后,用fflush清空缓冲区,或者,把缓冲区数据用scanf,getchar等输入函数给拿出来,数据取完了,stdin缓冲区就没东西了,再select,状态就是等待事件发生状态了。
为了保险,你每次重新把tv给赋值一次.
tv.tv_sec=2;
tv.tv_usec=0;
因为,你按下一个键之后,缓冲区里面有数据了,也就是说,stdin已经发生了一个事件,就是有数据来了。
你一直没有对缓冲区做任何操作,因此stdin一直保持着有数据的状态。
如果你在个select返回之后,用fflush清空缓冲区,或者,把缓冲区数据用scanf,getchar等输入函数给拿出来,数据取完了,stdin缓冲区就没东西了,再select,状态就是等待事件发生状态了。
为了保险,你每次重新把tv给赋值一次.
tv.tv_sec=2;
tv.tv_usec=0;
展开全部
Linux下调用select之后,tv 参数可能被重置!如果下一次还想等待相同时间,应该重新设置tv!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没听说过在线程中(pthread)不能select或者有特殊用法的说法,提供更详细一点的信息吧……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
N次吧
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询