中易网

关于Linux下一个小程序中select()函数的问题,这个程序中select到底执行了几次?

答案:4  悬赏:60  
解决时间 2021-03-24 06:28
代码如下,该程序中以标注输入(STDIN)作为文件描述符,然后调用select函数,一共调用了三次,按说应该执行三次,比如说我每次都不输入,那么执行顺序应该是:等待2秒->输出time out->等待2秒->输出time out1->等待2秒->输出time out2。但实际执行时是这样的:等待2秒->输出time out->输出time out1->输出time out2。这是为什么呢?另外如果我在等待期间按一个按键,执行结果也是第一次执行,第2、3次不执行。希望高人能点拨我一下,谢谢!
#include
#include
#include
#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怎么用的,结果跟预想的不一样,代码都在这里了。。。
最佳答案
原因很简单。

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

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

为了保险,你每次重新把tv给赋值一次.
tv.tv_sec=2;
tv.tv_usec=0;
全部回答
Linux下调用select之后,tv 参数可能被重置!如果下一次还想等待相同时间,应该重新设置tv!
没听说过在线程中(pthread)不能select或者有特殊用法的说法,提供更详细一点的信息吧……
把源代码写出来.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
早上去林子看了看夹子抓了什么好东西,结果抓
为什么流量的价值是通过服务体现的
请问谁知道中国汽车用品门户网的域名?
汽车在多深的水中可以行使?
HD6850升级显卡到GTX960 4G 可以吗
elie saab婚纱在国内能定制吗
衡阳到黄山坐火车要多久
爱的人收了别人的见面钱是怎么说
广东中山德邦物流托运摩托车到四川绵竹要多少
山西潞城市到陕西定边县有多远
77年和88年婚配
耳朵里有暗红色的东西,还臭的
余姚市公共自行车服务卡丢失了怎么办?
土办法怎样去除眼皱纹我想在这里咨询下
有13个产品其中一个是次品,用天秤称3次查出这
推荐资讯
宁波火车站到雅戈尔达蓬山文化旅游区怎么去、
G大调艺术培训地址在什么地方,我要处理点事
冬天在北方能看到天狼星吗
松原到铜陵最佳铁路路线
生长素的价格那个价位比较合适
在村里干活怎么写结账证明
有谁打通过天天快递这个垃圾的电话?
无公害食品有哪些呢?
忘了计提前两个月的电费,管理费,该如何处理
百世汇通快递广州市离河北巨鹿有多远
如果点P(m,1-2m)在第四象限,那么m的取值
我是山西考生 比1本线低2分 山西财经跟西安财
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?