Linux——多路复用之poll模型

功能:针对大量描述符进行监控

函数接口:

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

参数说明:

fds:pollfd结构体数组

cs 复制代码
struct pollfd {
Int fd;// 要监控的描述符


short events;// 该描述符要监控的事件


short revents;//poll监控返回时设置的实际就绪事件

};

事件宏:POLLIN-可读;POLLOUT-可写;

异常事件:POLLHUP-挂断;POLLERR-出错;POLLNVAL-无效请求 POLLRDHUP-连接半关闭(对端关闭了读)

额外知识点:

网络通信程序,编写的时候都需首先忽略SIGPIPE信号,tcp对端关闭了连接,或者关闭了读操作,继续send写入数据就会触发SIGPIPE异常,导致异常退出。

signal(SIGPIPE, SIG_IGN);

Tcp连接断开之后,继续recv就会返回0不在阻塞;继续send就会触发SIGPIPE异常

nfds:fds数组的有效元素数量

timeout:监控阻塞超时时间(毫秒)

-1:阻塞直到有就绪

0:非阻塞

>0:指定阻塞时间

返回值:

<0:出错

==0:超时

>0:实际就绪的描述符数量

(1)操作流程:

1.定义描述符事件结构体数组(数组的大小根据实际场景确定)

2.将需要监控的描述符以及所要监控的事件,添加到数组中

3.发起poll监控调用

a.监控原理与select 并无差别

b.现将数组数据,拷贝到内核中

c.对所有的有效元素进行遍历,判断是否有就绪

i. 有就绪则直接返回,并且设置对应元素的revents成员

ii. 没有就绪的,就阻塞进程

iii.当有描述符就绪的时候,唤醒进程阻塞,再次遍历数组,重置revents成员

  1. 调用返回后,遍历数组,根据数组中的revent确定实际就绪的事件进行IO操作

大代码流程:

实现一个简单的poll使用样例

对标准输入进行可读事件监控,就绪了则读取数据进行打印

cpp 复制代码
/*
    实现一个简单的poll使用样例
        对标准输入进行可读事件监控,就绪了则读取数据进行打印
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/poll.h>
int main(){
    //1. 定义描述符事件结构数组
size_t size = 0;
struct pollfd fds[1024];
//2. 向数组中添加描述符以及要监控的事件
fds[size].fd = 0;
fds[size].events = POLLIN;
size += 1;

while(1) {
int ret = poll(fds, size, 3000);
if (ret < 0) {
perror("poll error");
continue;
}else if (ret == 0) {
printf("timeout\n");
continue;

//4.遍历数组,对就绪的描述符进行实际就绪事件的处理
for (int i = 0; i < size; i++) {
if (fds[i].revents & POLLIN) {
//就绪了可读事件
char buffer[1024] = {0};
read(fds[i].fd, buffer, 1023);
printf("读取的到数据:%s\n",buffer);

}
}

}

return 0;

}
相关推荐
Java后端的Ai之路22 分钟前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索
H.莓飛1 小时前
【数据结构】队列_OJ题
linux·数据结构·centos
H.莓飛1 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Ruiery1 小时前
Linux 6.6内核 CPU 深度解析(一):BSP 拉起 — 从实模式到 kernel_init 的完整旅程
linux·运维·服务器
通信瓦工1 小时前
利用浊度和电导率测量确定乙二醇基流体的质量
网络·数据库·ai
赵民勇1 小时前
dconf命令详解
linux·运维
阿钱真强道1 小时前
33 嵌入式操作系统 | 模块七验收:端到端一键验收 + 项目答辩
网络·网络协议·粘包·回归测试·uloop
ggaofeng1 小时前
Ctrl+C结束进程是如何实现的
服务器·c语言·网络
和裕2 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
qeen873 小时前
【Linux】Linux环境下的进程终止与进程等待问题
linux·运维·服务器