select是用来设置超时时间的,其第一个参数本来是一个文件号,假如读取该文件长时间没有返回则超时跳出,而这部分代码将文件号设置为0,说明只是为了控制延时不过看你这部分代码,明显只是实现一个比较精确定时的sleep这段代码之所以这么做,是因为linux本身的sleep
函数非常不准(windows也是一样),在线程较多,cpu任务较重的时候,sleep函数的精确度根本无法达到要求于是你这段代码使用select来代替sleep更为精准,其精准程度和内核相关,如果内核的滴答频率决定的,一般是100HZ也有1000hz的(因内核版本不同而不同),也就是说select做多可以精确到10ms,或者1ms,而sleep就做不到于是这段函数最重要的作用就是用高精确的select函数来代替低精确度的sleep函数,实现时间较为精准的延时。可查阅《Linux就该这么学》了解更多Linux介绍。原因很简单。
因为,你按下一个键之后,缓冲区里面有数据了,也就是说,stdin已经发生了一个事件,就是有数据来了。
你一直没有对缓冲区做任何 *** 作,因此stdin一直保持着有数据的状态。
如果你在个select返回之后,用fflush清空缓冲区,或者,把缓冲区数据用scanf,getchar等输入函数给拿出来,数据取完了,stdin缓冲区就没东西了,再select,状态就是等待事件发生状态了。
为了保险,你每次重新把tv给赋值一次.
tv.tv_sec=2
tv.tv_usec=0
评论列表(0条)