• 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,检测就绪事件。

     

     

     

  • 相关阅读:
    ASP.NET Post方式提交
    MVC增加操作日志
    asp.net MVC 下拉多级联动及编辑
    redis基本数据类型之String
    关于idea下使用springinitializr创建项目时 初始化失败的解决
    Failed to read artifact descriptor for org.mybatis:mybatis:jar:2.2.1
    如何查看日志文件
    nginx 部署vue 以及同一端口下部署监听多个vue 项目
    JsonView 与JsonIgnore 使用
    vue 打包部署
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/14348786.html
Copyright © 2020-2023  润新知