美文网首页
select 模型

select 模型

作者: 混世太保 | 来源:发表于2019-03-05 23:16 被阅读0次

    问题:

    1. select是什么?什么是select?
    2. select?用于解决什么问题?
    3. select的用法?
    4. 采用select编程解决问题?

    select是什么

    1. select是一个计算机函数。该函数用于监视文件描述符的变化情况——读写或是异常。

    select用于解决什么问题

    1. 操作系统提供select函数来实现多路复用输入/输出模型

    select用法

    select可以理解为c++的类。fdset可以理解为一个类的实例。将fdset看成this指针。那就是一个c++的类了。
    它有如下成员函数:

    void FD_ZERO (fd_set * fdset); // clear all bits in fdset
    void FD_SET (int fd,fd_set *fdset); // turn on the bit for fd in fdset
    void FD_CLR (int fd,fd_set *fdset); // turn off the bit for fd in fdset
    int FD_ISSET(int fd,fd_set *fdset); // is the bit for fd on in fdset
    
    系统函数,监督读文件符集和写文件符集及异常文件符集
    int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);
    
    FD_ZERO

    清楚一个文件描述符集

    FD_SET

    将一个文件描述符加入文件描述符集中

    FD_CLR

    将一个文件描述符从文件描述符集中清楚

    FD_ISSET

    测试该集中的一个给定位是否有变化。检查在select函数返回后,某个描述符是否准备好

    select

    参数maxfdp,传入时,应该是最大的文件描述符加1。
    参数readfds,检测该组文件符集中是否有事件可读。可为NULL。
    参数writefds,检测该组文件符集中是否有事件可写。可为NULL。
    参数errorfds,检测该组文件符集中是否有异常出现。可为NULL。
    参数timeout,如果置为NULL。则select一直阻塞,直到三个文件描述符集中有事件发生。
    如果为0,则非阻塞,仅检测描述符集合状态,然后立即返回,不等待三个描述符集是否有事件发生。
    如果为非零时间,则等待固定时间后返回。或者有事件发送返回。

    代码例子
    例子1. 监听输入事件
    #include <sys/types.h> 
    #include <sys/time.h> 
    #include <stdio.h> 
    #include <fcntl.h> 
    #include <sys/ioctl.h> 
    #include <unistd.h> 
    #include <stdlib.h>//exit
    int main() 
    { 
        char buffer[128]; 
        int result, nread; 
        fd_set inputs, testfds; 
        struct timeval timeout; 
        FD_ZERO(&inputs);//用select函数之前先把集合清零 
        FD_SET(STDIN_FILENO,&inputs);//把要检测的句柄——标准输入(0),加入到集合里。
        while(1) 
        { 
           testfds = inputs;//无限置零。。。
           timeout.tv_sec = 2; 
           timeout.tv_usec = 500000;//500毫秒
           // FD_SETSIZE最大长度的fdset。
           result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, &timeout); 
           switch(result) 
           { 
           case 0: 
               printf("timeout\n"); 
               break;
           case -1: 
               perror("select"); 
               exit(1); 
           default: 
               if(FD_ISSET(STDIN_FILENO,&testfds)) 
               { 
                   ioctl(STDIN_FILENO,FIONREAD,&nread);//取得从键盘输入字符的个数,包括回车。 
                   if(nread == 0) 
                   { 
                      printf("keyboard done\n"); 
                      exit(0); 
                   } 
                   nread = read(STDIN_FILENO,buffer,nread); 
                   buffer[nread] = 0; 
                   printf("read %d from keyboard: %s\n", nread, buffer); 
             } 
             break; 
          }
       } 
       return 0;
    } 
    

    相关文章

      网友评论

          本文标题:select 模型

          本文链接:https://www.haomeiwen.com/subject/sjzauqtx.html