epoll模型下的简易版code

epoll模型下的简易版code

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <fcntl.h>

#define MAX_EVENTS 10
#define NUM_DESCRIPTORS 5  // 模拟多个文件描述符

// 处理事件的函数
void handle_event(struct epoll_event *event) {
    // 如果事件对应的文件描述符是标准输入
    if (event->data.fd == STDIN_FILENO) {
        printf("stdin is ready\n");
    } 
    // 如果事件对应的文件描述符是在标准输入之后模拟的多个描述符中的一个
    else if (event->data.fd >= STDIN_FILENO + 1 && event->data.fd <= STDIN_FILENO + NUM_DESCRIPTORS) {
        printf("Descriptor %d is ready\n", event->data.fd);
    }
}

int main() {
    int epfd, nfds;  // epfd 是 epoll 文件描述符,nfds 用于存储实际发生事件的数量
    struct epoll_event event, events[MAX_EVENTS];
    int descriptors[NUM_DESCRIPTORS];  // 用于存储模拟的多个文件描述符

    // 创建 epoll 实例
    epfd = epoll_create1(0);  // 参数:flags,通常为 0,表示默认行为

    if (epfd == -1) {
        perror("epoll_create1");  // 如果创建失败,打印错误信息
        exit(EXIT_FAILURE);  // 退出程序并返回失败状态
    }

    // 模拟多个文件描述符并添加到 epoll 监听
    for (int i = 0; i < NUM_DESCRIPTORS; i++) {
        descriptors[i] = STDIN_FILENO + 1 + i;  // 生成模拟的文件描述符
        event.events = EPOLLIN;  // 设置事件类型为可读
        event.data.fd = descriptors[i];  // 设置事件对应的文件描述符
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, descriptors[i], &event) == -1) {  // 将描述符添加到 epoll 监听
            perror("epoll_ctl");  // 如果添加失败,打印错误信息
            exit(EXIT_FAILURE);  // 退出程序并返回失败状态
        }
    }

    while (1) {
        // 等待事件发生
        nfds = epoll_wait(epfd, events, MAX_EVENTS, -1);  // 参数:epoll 文件描述符,事件数组,数组大小,超时时间(-1 表示无限等待)

        if (nfds == -1) {
            perror("epoll_wait");  // 如果等待事件时出错,打印错误信息
            break;  // 退出循环
        }

        for (int i = 0; i < nfds; i++) {
            handle_event(&events[i]);  // 处理发生的事件
        }
    }

    close(epfd);  // 关闭 epoll 文件描述符

    return 0;
}
```

整体思路:

  • 主要是创建一个 epoll 实例,然后模拟多个文件描述符并添加到 epoll 进行监听。在一个循环中等待事件发生,并对发生的事件进行相应处理。

实现过程:

  • 在 handle_event 函数中定义了对不同文件描述符事件的处理逻辑,比如对标准输入和模拟的其他描述符的事件分别进行输出。
  • 在 main 函数中,首先创建 epoll 文件描述符 epfd。然后创建模拟的多个文件描述符数组 descriptors。通过循环将这些描述符添加到 epoll 监听,并设置相应的事件类型为可读。之后进入一个无限循环,通过 epoll_wait 等待事件发生,获取到事件数量 nfds 后,对每个事件进行处理。

技术点:

  • epoll 机制:用于高效地处理大量文件描述符的 I/O 事件。
  • 事件监听和处理:通过设置事件结构体的属性来指定要监听的事件类型,并在事件发生时进行相应的处理操作。
  • 错误处理:对创建 epoll、添加监听等操作中的错误进行了捕获和处理,以保证程序的健壮性。

另外,看到一个文章解释挺详细,分享大家一起看。

https://zhuanlan.zhihu.com/p/427512269

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值