select()函数 timval问题

如果select调用中设置了等待时间,那么每次调用时都需要重新对这个时间赋值。例如: 
struct timval tv; 
while(1) {

  ........;
   tv.tv_sec = 2; 
  tv.tv_usec = 0; 
  select(maxfd+1, &readfd, NULL, NULL, &tv); 

传的是一个引用进去,select里面可能会改变这个地址里保存的内容。所以每次循环都必须重新赋值
------------------------------
  将时间的初始化放在外边,时间初始化为2秒,假设在1秒后发上了事件,则select将会返回并将tv的时间变成上次阻塞的剩余时间,即1秒,然后再进行监视套接字。这是因为linux系统对select()的实现中会修改参数tv为剩余时间。所以在循环内部使用函数select的时候一定要在循环内部初始化时间参数。
 
  在网络程序中,一个进程同时处理多个文件描述符是很常见的情况。select()系统调用可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select()阻塞,其中任一设备准备好时,select()就返回。
    这个函数真是神通广大,用来定时也不错。select(0, NULL, NULL, NULL, &tv); tv在每次执行select前都要重新设定一遍,不然就变成0了。感觉它的精度比usleep()要高一些。
原文地址:https://www.cnblogs.com/yunsicai/p/3382035.html