zoukankan      html  css  js  c++  java
  • select系统调用

    1 #include <sys/select.h>   
    2 int select(int maxfdps, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

      maxfdps:被监听的文件描述符(fd)的数量;

      readset:结构指针类型(readset指向一个结构体),该结构体仅包含一个内置的整型数组,表示可读事件对应的fd集合,该数组中的每一位(bit)标记一个fd。由于fd集合是用内置数组表示的,所以能够容纳的fd的数量有限,限制了select能够同时处理的fd的数量;
      writeset(可写事件),exceptset(异常事件)同上;
      timeout:结构指针类型,设置select函数的超时时间,该结构体包含两个long型变量,分别表示表示秒数和微秒数。

    1 struct timeval
    2 {
    3     long tv_sec; //秒数
    4     long tv_usec; //微秒数
    5 };

      返回值:给timeout的两个成员变量均传递0,select立即返回;传递NULL,select一直阻塞,直到某个fd就绪或者程序捕获到一个信号时,select才返回。
          select成功,返回就绪的fd(含可读,可写和异常事件对应的fd)的数量(超时时间内没有fd就绪,返回0);
          select失败,返回-1。

      采用一系列宏来访问fd_set中的位:

    1 #include <sys/select.h>   
    2 int FD_ZERO(int fd, fd_set *fdset);   //清除所有位,置0int FD_CLR(int fd, fd_set *fdset);   //清楚某一位fd,置0
    3 int FD_SET(int fd, fd_set *fd_set);   //设置某一位fd,置1
    4 int FD_ISSET(int fd, fd_set *fdset); //测试某一位fd是否被置1

       应用程序调用select函数时,传入感兴趣的fd(对应的位置1,不感兴趣的置0)和超时时间,select调用返回时,内核修改fd_set数组通知应用程序哪些fd已经就绪(对应的位置1,未准备就绪的置0),通过遍历数组,来轮询检测就绪事件;修改timeval的成员通知应用程序阻塞了多久。

      调用顺序:FD_ZERO,清空fd集合;FD_SET,设置感兴趣的fd;select,监视就绪的fd;FD_ISSET,检测就绪事件。

     

     

     

  • 相关阅读:
    spring-pool.xml
    spring-jmx.xml
    spring-common.xml
    applicationContext.xml
    spring-webservice.xml
    webservice统一认证
    jdbc.properties
    oracle,mysql分页
    springmvc-servlet.xml
    四、用“”或构造函数创建Java的String区别
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/14348786.html
Copyright © 2011-2022 走看看