I/O多路转接

阅读: 评论:0

I/O多路转接

I/O多路转接

I/O多路转接---poll

select函数的缺点(相对于poll和epoll而言)

  • 每次调用select,都需要手动的设置fd集合,从接口使用角度不太方便.
  • 每次调用select,都需要把fd集合从用户态拷贝到内核态,开销大
  • 在内核需要遍历传递进来的fd,开销大
  • 支持的文件描述符太小

poll函数在select的基础上,解决了两个缺点

   a>poll所监视的文件描述符无上限.select之所以有限制,是因为它采用的是位图来储存的,而poll采用的是一个pollfd指针,基于链存储的,只要内存不受限制,理论上是没有其他限制的.

    b>select每次调用,都需要手动设置fd集合,从接口角度来看,不方便.而poll将输入参数和输出参数分离开,用events来监测的fd,用revent来表示就绪的fd.

A>poll函数接口

#include <poll.h> 
int poll(struct pollfd *fds, nfds_t nfds, int timeout); 
// pollfd结构 
struct pollfd { int   fd;         /* file descriptor */  /* 保存要监测的fd,由用户自己设定 */short events;     /* requested events */ /* 保存要监测的事件,如读、写,有用户设定 */short revents;    /* returned events */ /* 保存就绪事件,由内核设定 */
};

poll监控标准输入:

1 #include<stdio.h>                                                                                                    2 #include<unistd.h>3 #include<poll.h>4 int main(){5   struct pollfd  poll_fd;6   poll_fd.fd = 0;7   poll_fd.events = POLLIN;//数据可读8   while(1){9       //利用poll函数进行等待10    int ret = poll(&poll_fd,1,0);//0表示阻塞式等11    if(ret<0){12      perror("poll");13      break;14    }15    //如果poll返回了,就说明0号文件描述符已经就绪16    char buf[1024] = {0};17    ssize_t read_size = read(0,buf,sizeof(buf)-1);18    if(read_size<0){19      perror("read");20      return 1;21    }22    if(read_size==0){23      printf("read done!n");24      return 0;25    }26    buf[read_size] = '';27    printf("%s n",buf);28   }29   return 0;30 }

本文发布于:2024-01-30 20:48:00,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170661889622734.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:多路
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23