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()要高一些。
  • 相关阅读:
    浅析Linux操作系统是如何工作的(思维导图)
    【Git】创建一个空分支
    ubuntu13.04更新源
    【Linux操作系统分析】设备驱动处理流程
    django-xss攻击原理与防范
    django—xadmin中集成富文本编辑器ueditor
    垃圾回收机制
    元组-不仅仅是不可变的列表
    不一样的列表
    Python数据模型
  • 原文地址:https://www.cnblogs.com/yunsicai/p/3382035.html
Copyright © 2011-2022 走看看