IO多路复用函数原型总结(方便查询)

ops/2024/9/23 14:56:20/

一,select多路复用

1,select(5)函数原型

​ 用来进行select多路复用。效率较低。返回值为正数,就是已经就绪的文件描述符的个数,出错返回负数,超时返回0。在Linux内核有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,这也意味着select所用到的FD_SET是有限的,也正是这个原因select()默认只能同时处理1024个客户端的连接请求:/linux/posix_types.h: #define __FD_SETSIZE 1024

返回值:

>0该函数的返回值表示跨所有描述符集的已就绪的总位数。

=0超时

<0select出错

#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);int nfds//总共需要从零开始监听的文件描述符的数量,即你需要监听的最大的文件描述符+1,因为他是从零开始数的,这个值指的是数量而不是对应的文件描述符。fd_set *readfds//有数据到来可读的文件描述符的集合。fd_set 是一个数据类型,他就是一个文件描述符的集合。fd_set *writefds//文件描述符可写的集合。fd_set *exceptfds//文件描述符出错,异常的集合struct timeval *timeout//超时设置。设置为NULL为永不超时。设置为0那么就是非阻塞模式。
//结构体构成,该结构体一般用time
struct timeval
{long tv_sec; //seconds  秒long tv_usec; //microseconds 微秒
};

2,FD_ZERO(1)函数原型

​ 用来清空文件描述符集合。

返回值:无。

#include <sys/select.h>
void FD_ZERO(fd_set *set);fd_set *set//要清空的文件描述符集合的地址,同时也可以用来初始化一个fd_set。

3,FD_SET(2)函数原型

​ 将一个文件描述符加入到某一个文件描述符集合里。

返回值:无。

#include <sys/select.h>
void FD_SET(int fd, fd_set *set);int fd//要加入fd_set的文件描述符fd_set *set//文件描述符集合的地址。

4,FD_ISSET(2)函数原型

​ 用来判断指定的文件描述符是否在文件描述符集合中。

返回值:

非零值该fd在fdset中。

0该fd不在fdset中。

#include <sys/select.h>
int	FD_ISSET(int fd, fd_set *set);int fd//要判断的文件描述符fd_set *set//文件描述符集合的地址。

5,FD_CLR(2)函数原型

​ 将给定的文件描述符从集合中删除。

返回值:无

#include <sys/select.h>
void FD_CLR(int fd, fd_set *set);int fd//要删除的文件描述符fd_set *set//文件描述符集合的地址。

二,poll多路复用

1,poll(3)函数原型

​ 和select()一样,poll用于多路复用,原理上差不多,但是没有最多同时监听1024个文件描述符的限制。

返回值:

>=0成功,返回响应的文件描述符的数量。poll()返回结构体中revents域不为0的文件描述符个数。

0超时。

-1出错。并设置errno为下列值之一:
EBADF 一个或多个结构体中指定的文件描述符无效。
EFAULTfds 指针指向的地址超出进程的地址空间。
EINTR 请求的事件之前产生一个信号,调用可以重新发起。
EINVALnfds 参数超出PLIMIT_NOFILE值。
ENOMEM 可用内存不足,无法完成请求。

#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);struct pollfd *fds//一个结构体,里面包含着我们需要监听的文件描述符。POLLIN | POLLPRI  	         等价于		 select()的读事件                                   POLLOUT |POLLWRBAND			 等价于		 select()的写事件                                   POLLIN						 等价于		 POLLRDNORM |POLLRDBAND                           POLLOUT					   等价于		   POLLWRNORMnfds_t nfds//指定数组中监听元素的个数。int timeout//超时时间,单位是ms毫秒。设置为负数时永不超时,而设置为0时,表示函数不阻塞,立即返回。
struct pollfd 
{int   fd;         //要监听的文件描述符 short events;     // requested events 应用传给内核的事件,即让内核监听什么事件short revents;    // returned events */内核传给我们的应用的事件,即内核发生了什么
};

struct pollfd *fds结构体中事件的可取值

在这里插入图片描述

三,epoll多路复用

1,epoll_create(1)函数原型

​ 创建一个额外的文件描述符epfd,同时他也是一个兴趣列表,在epoll文件系统中为这个句柄分配资源。对应的兴趣列表初始化为空。出错返回-1,成功返回epfd的文件描述符。

返回值:

>=0成功,epoll_fd兴趣列表的文件描述符。

0超时。

-1出错。

#include <sys/epoll.h>
int epoll_create(int size);int size//指定我们通过epoll实例来检查的文件描述符的个数,但是并不是上限,Linux2.6.8后,他只是初始化时候内核分配的初始大小。

2,epoll_ctl(4)函数原型

​ 用来修改epfd中的兴趣列表。

返回值:

0成功。

-1失败。

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epfd//是epoll_create()的返回值,即创建的epoll实例的文件描述符。int op//想要执行的操作。int fd//要操作兴趣列表里面的哪一个文件描述符。struct epoll_event *event//指向epoll_event的一个结构体
  struct epoll_event {uint32_t     events;      /* Epoll events :关心的事件*/epoll_data_t data;        /* User data variable */};typedef union epoll_data {void        *ptr;int          fd;uint32_t     u32;uint64_t     u64;      } epoll_data_t;//一个联合体,当描述符fd为就绪态的时候,可用来指定传回给调用进程相应的信息

3,epoll_wait(4)函数原型

​ 返回epfd实例中已经处于就绪态的文件描述符信息。

返回值:

0成功。

-1失败。

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);int epfd//是epoll_create()的返回值,即epoll_fd兴趣列表的文件描述符struct epoll_event *events//接口的返回参数,epoll把发生的事件的集合从内核复制到 events数组中。events数组是一个用户分配好大小的数组,数组长度大于等于maxevents。(events不可以是空指针,内核只负责把数据复制到这个 events数组中,不会去帮助我们在用户态中分配内存)int maxevents//表示本次可以返回的最大事件数目,通常maxevents参数与预分配的events数组的大小是相等的。int timeout//超时,单位ms,-1永不超时,0为非阻塞模式。

*struct epoll_event evlist:

在这里插入图片描述


http://www.ppmy.cn/ops/14417.html

相关文章

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编…

Vue_管道符“|”(单竖线)的用处

目录 1、管道符是什么 2、应用场景 背景&#xff1a;项目中偶遇在 {{ }} 插值表达式里用了 “&#xff5c;”此写法&#xff0c;一开始误以为是写错了&#xff0c;应该是写成 “&#xff5c;&#xff5c;” 双竖线&#xff08; 逻辑或运算符 &#xff09;&#xff0c;结果询问…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

Linux系统硬盘读写慢,如何排查

若服务器硬盘读写慢&#xff0c;导致处理性能降低&#xff0c;用户响应慢&#xff08;例如&#xff1a;ssh登录操作文件&#xff0c;处理很慢说明磁盘很慢&#xff09; 1.查看硬盘是否繁忙 top 若值比较大&#xff0c;说明当前硬盘比较繁忙&#xff0c;有大量读写操作&#x…

常用的机器学习模型算法

LogisticRegression&#xff08;逻辑回归&#xff09;&#xff1a; 是一种线性模型&#xff0c;用于解决二分类问题。它通过将特征的线性组合映射到一个sigmoid函数上&#xff0c;输出一个0到1之间的概率值&#xff0c;用于预测样本属于某个类别的概率。 DecisionTreeClassifi…

【Linux】进程间通信(匿名管道 命名管道)-- 详解

⚪前言 如何理解进程间通信&#xff1f; 进程具有独立性&#xff0c;所以进程想要通信难度是比较大的&#xff0c;成本高。 在日常生活中&#xff0c;通信的本质是传递信息&#xff0c;但站在程序员角度来看&#xff0c;进程间通信的本质&#xff1a;让不同的进程看到同一份资…

基于单片机的羽毛球计分器(含proteus仿真和程序)

目录 完整文本及仿真、程序可私信我获取 前言 第一章 设计任务及方案 1.1 设计任务 1.2 总体设计分析 1.3 功能模块方案设计 1.4 方案确定 第二章、硬件设计 2.1 AT89C51 单片机芯片介绍 2.1.1 主要特性 2.1.2 管脚说明 2.1.3 元件清单 2.2 电路介绍 2…

半导体制造工艺之分类浅述

半导体制造工艺分为逻辑制程(也叫逻辑工艺)和特殊制程(也叫特色工艺)。 1、逻辑工艺概述 随着集成电路行业沿着摩尔定律不断发展,晶体管数量增加的同时,工艺节点不断缩小。先进逻辑工艺是相对的概念,2005年全球先进逻辑工艺的工艺节点在65/55纳米,现在则变为3纳米。中…