i/o 多路复用 poll模型讲解(未完待续)

B站就业班视频代码搬运

对应课程

 

1.函数原型

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

 poll 模型和select模型的作用相似,用于I/O 多路复用

1.1 函数参数;

1.1.1    struct pollfd *   fds

是结构体pollfd 组成的 数组的首地址,

struct pollfd

{

int fd;

short events;

short revents;

};

(1)int fd :文件描述符。如果fd == -1 表明内核不再监控。

(2)short events :输入参数,让内核去监视的事件,就像是 select 中让内核去监视读事件,写事件,异常事件

(3)short revents :输出参数,表示告诉内核,有哪些事件发生了改变。

调用 poll 函数,当监视的文件描述符有事件发生,内核修改的是 revents,而不修改 events 和 fd,这样做events 和 fd 就可以重用;poll 返回的是 revents 。

1.1.2   int ndfs:

表示内核监控的范围,具体:数组最大下标  +1

timeout:  

=0  不阻塞,立刻返回

 -1  表示一直阻塞,直到有事件发生,

 > 0 表示阻塞时长,在时长范围内如果有事件发生会立刻返回,如果超时,也会立刻返回,

POLLIN  表示监控读事件

POLLPRI 紧急事件去读

POLLOUT  可写事件

POLLERR  错误事件。但是仅仅返回在revents , 在events 中错误被忽略了。

读事件,客户端有连接过来,才能读, 而写事件基本上用不着监控(主动写发送的),除非写的太多把缓冲区写满了。。

1.2.   返回值

一个正数, 代表revents 不是0的 个数,表示的意思是有事件返回或者有错误返回的文件描述符的总数。

如果返回0,表示没有任何文件描述符有变化。

如果返回-1 ,表明有一个错误errno没有被正确设置。

2.使用pol l 模型实现服务器的流程

  1. 创建socket ,得到监听文件描述符 lisenfd;     --socket()
  2. 设置端口复用  --setsockopt();
  3. 绑定 --bind ()
  4. 定义pollfd结构体的数组fdarray[1024]

     fdarray[0].fd = lisenfd;

     fdarray[0].events = POLLIN;

     int maxindex = 0 ;//maxindex --数组里最大的那个下标的值

      for ( i =1; i<1024; i++) {

           fdarray[i].fd = -1;   //全部初始化,-1的fd 不被检测

     }

      while (1) {

         nready =poll ( fdarray, maxindex +1, -1);

//未完待续

你可能感兴趣的:(就业班视频学习,c++,linux,服务器)