• 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()要高一些。
  • 相关阅读:
    npx 是什么?
    JavaScript 的内置对象和浏览器对象
    JS构造函数new的过程
    git 设置和取消代理
    npm配置镜像、设置代理
    SQL 注入攻击案例
    javascript:void(0);的含义以及使用场景
    让所有网页图片跳起舞来的代码
    针对Web的攻击技术
    网站常见的鉴权认证方式有哪几种?
  • 原文地址:https://www.cnblogs.com/yunsicai/p/3382035.html
Copyright © 2020-2023  润新知