zoukankan      html  css  js  c++  java
  • Linux_ select 多路复用

    多路复用select

    1. 问题
      当需要等待某个或多个设备(文件)可读或可写时,
      如果使用循环不停地检测是否可读可写,则效率很低。

      解决办法:
      使用select系统调用。

    2. select的用法
      man 2 select

      int select(int nfds,
      fd_set *readfds,
      fd_set *writefds,
      fd_set *exceptfds,
      struct timeval *timeout);
      功能:阻塞readfds、writefds和exceptfds中的文件描述符,
      直到其中任一个文件描述符达到对应的状态(可读、可写、或错误状态),
      或者最久阻塞到指定的超时时间。

      文件描述符集fd_set
      相关操作:FD_ZERO 清空集合
      FD_CLR 把指定的文件描述符从集合中删除
      FD_SET 把指定的文件描述符添加到集合中
      FD_ISSET 检查指定的文件描述符是否在集合中

      时间类型struct timeval
      见man 2 select
      struct timeval {
      long tv_sec; /* seconds */
      long tv_usec; /* microseconds */
      };

      参数1:表示要监听的文件描述符个数。
      如果为3,则监听0,1,2
      一般取需要监听的文件描述符的最大值+1
      参数5:超时时间,如果为NULL, 则表示不使用超时时间,即一直阻塞。

      返回值:
      成功:返回状态发生变化的文件描述符总数
      失败: 返回-1(中断、无效的文件描述符、select的参数1/参数5错误)

      注意:select返回后,文件描述符集中会发生变化,如果超时,则都清空
      超时时间则可能发生变化。
      所以,在循环监听中,重新select之前,要重新设置超时时间和文件描述符集

           select返回后,如果返回值>0,
                               则需要再次检测,所需要的文件描述符是否在对应的集合中!
      
    3. 实例
      main1.c
      循环监听用户的输入,一收到就打印输出。
      直到用户输入exit

      “set_tx_power 30”

      atoi(“30”) = 30
      atoi(” 30”) = 30
      atoi(a30”) = 0

  • 相关阅读:
    PCB Genesis加邮票孔(线与线)实现算法
    PCB 无需解压,直接读取Zip压缩包指定文件 实现方法
    PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明
    PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)
    PCB MS CLR 聚合函数 joinString加排序实现
    PCB 奥宝LDI 输出自动改周期检测内容
    如何介绍项目
    二叉树的深度
    51单片机汇编指令手册
    SSM父子工程搭建
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384213.html
Copyright © 2011-2022 走看看