I/O多路转接---poll

2024-01-07 07:10
文章标签 转接 多路 poll

本文主要是介绍I/O多路转接---poll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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] = '\0';27    printf("%s \n",buf);28   }29   return 0;30 }

这篇关于I/O多路转接---poll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/579106

相关文章

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

C++ I/O多路复用 select / poll / epoll

I/O多路复用:在网络I/O中,用 1个或1组线程 管理 多个连接描述符。             如果有至少一个描述符准备就绪,就处理对应的事件             如果没有,就会被阻塞,让出CPU给其他应用程序运行,直到有准备就绪的描述符 或 超时

select、poll、epoll的区别

select、poll、epoll均为linux中的多路复用技术。3种技术出现的顺序是select、poll、epoll,3个版本反应了多路复用技术的迭代过程。我们现在开发网络应用时, 一般都会使用多路复用,很少有用一个线程来监听一个fd的,其中epoll又是最常使用的。关于epoll的实现和常见问题可以参考epoll实现原理和常见问题总结。 当我们在使用epoll的时候,会想当然的认为这种技术

select poll epoll之间的区别比较

select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核

select、poll、epoll的原理

目录 1.IO多路复用 2.select原理 3.poll原理 4.epoll原理 5.select、poll、epoll总结 6.epoll原理详解 6.1内核收包的过程 6.2进程调度时的阻塞 6.3再来看一下内核收网络数据的过程 6.4select的原理 6.5epoll的设计原理 6.6补充 6.7总结 1.IO多路复用 IO多路复用就是一个线程同时监

IO多路复用,select、poll、epoll区别

IO多路复用是一种同步IO模型,一个线程监听多个IO事件,当有IO事件就绪时,就会通知线程去执行相应的读写操作,没有就绪事件时,就会阻塞交出cpu。多路是指网络链接,复用指的是复用同一线程。 select fd_set数据结构定义如下,可以看出fd_set是一个整型数组,用于保存socket文件描述符typedef long int __fd_mask;/* fd_set for select

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (二) 源码架构流程梳理、代码编写

目录 1 视频解码代码编写----利用jetson-ffmpeg 1.1 nvstream中视频解码的代码流程框架 1.1.1 类的层次关系 1.1.2 各个类的初始化函数调用层次关系 1.1.3 各个类的process函数调用层次关系 1.2 编写视频解码代码 1.2.1 修改VideoInfo结构体定义 1.2.2 修改解封装代码 1.2.3 decode_impl_nv.h

BTree(多路搜索树)

一、用途 B-tree(balence tree)具有良好的定位特性,其常被用于对检索时间要求苛刻的场合,例如:         1、B-tree索引是数据库中存取和查找文件(称为记录或键值)的一种方法。         2、硬盘中的结点也是B-tree结构的。与内存相比,硬盘必须花成倍的时间来存取一个数据元素,这是因为硬盘的机械部件读写数据的速度远远赶不上纯电子媒体的内存。与一个结点两

IO端口复用之poll的底层实现

介绍     解说中存在一些函数和数据结构,具体出处可以参照上一篇关于select的分析 《IO端口复用之select的底层实现》,里面提及了一些储备知识点,本篇不再赘述。     由于tcp过于复杂,取个巧,全篇以udp连接来说明一下,内核版本依旧对应2.6.32。 poll系统调用做了什么 接口说明     poll系统调用接口,一共需要3个参数。     第一个参数是监听集指针u