zoukankan      html  css  js  c++  java
  • 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()要高一些。
  • 相关阅读:
    .net正在终止线程异常
    js判断客户浏览器类型,版本
    C#中ToString格式大全
    WPF TextBox 搜索框 自定义
    C#:获取设备电量相关信息
    C#中的委托与事件并存的理由
    WPF中的Pack URI
    SQLServer中的数据库备份和还原
    使用Aspose.Cells读取Excel
    SQLServer存储过程事务用法
  • 原文地址:https://www.cnblogs.com/yunsicai/p/3382035.html
Copyright © 2011-2022 走看看