美文网首页
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模型

    阻塞和非阻塞 在win32的socket编程中,默认是阻塞的,使用阻塞其实可以简化程序员的代码量,但是通常效率收很...

  • select 模型

    问题: select是什么?什么是select? select?用于解决什么问题? select的用法? 采用se...

  • select I/O多路复用

    select golang的并发模型和linux select类似golang提供了select关键字,实现I/O...

  • Epoll 模型简介

    网络IO的模型中,之前介绍了select模型。select 确实是一个简明好用的模型。可是现在的服务器却越来越少采...

  • Select 模型简介

    多路复用I/O 在简明网络I/O模型文章可以知道常用的IO模型。其中同步模型中,使用多路复用I/O可以提高服务器的...

  • WSAAsyncSelect 消息模型

    select 模型虽然可以管理多个socket,但是它涉及到一个时机的问题,select模型会针对所管理的数组中的...

  • linux网络编程系列(十一)--select基本使用以及它和e

    1. select函数 复用IO还有一种就是select模型,我们下面就来简单介绍一下select用法。 1.1 ...

  • netty

    I/O 模型 阻塞I/O模型(BIO) 非阻塞I/O模型 I/O复用模型(select/poll;epoll)se...

  • Linux下I/O多路复用select, poll, epoll

    Linux下I/O多路复用select, poll, epoll 三种模型 select, poll, epoll...

  • Running a Simulation ~Editing a

    选择控制器选择模型窗口字段和按钮Select Controller(选择控制器)Select(选择) 切换选择或...

网友评论

      本文标题:select 模型

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