关于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怎么用的,结果跟预想的不一样,代码都在这里了。。。
展开
 我来答
handsoul
2010-12-11 · TA获得超过955个赞
知道小有建树答主
回答量:500
采纳率:0%
帮助的人:749万
展开全部
原因很简单。

因为,你按下一个键之后,缓冲区里面有数据了,也就是说,stdin已经发生了一个事件,就是有数据来了。
你一直没有对缓冲区做任何操作,因此stdin一直保持着有数据的状态。

如果你在个select返回之后,用fflush清空缓冲区,或者,把缓冲区数据用scanf,getchar等输入函数给拿出来,数据取完了,stdin缓冲区就没东西了,再select,状态就是等待事件发生状态了。

为了保险,你每次重新把tv给赋值一次.
tv.tv_sec=2;
tv.tv_usec=0;
sch100
2010-12-10 · 超过12用户采纳过TA的回答
知道答主
回答量:51
采纳率:0%
帮助的人:21.4万
展开全部
Linux下调用select之后,tv 参数可能被重置!如果下一次还想等待相同时间,应该重新设置tv!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ddeeic
2010-12-10 · TA获得超过746个赞
知道答主
回答量:381
采纳率:0%
帮助的人:253万
展开全部
没听说过在线程中(pthread)不能select或者有特殊用法的说法,提供更详细一点的信息吧……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Ultraman84
2010-12-10 · 超过17用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:41.2万
展开全部
N次吧
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式