首页 > 其他分享 >epoll_event

epoll_event

时间:2024-05-22 10:19:11浏览次数:20  
标签:epoll event 描述符 fd data events

epoll_event 是 Linux 内核提供的一个数据结构,用于在 epoll 机制中表示事件。epoll 是一种高效的 I/O 事件通知机制,通常用于处理大量并发连接。epoll_event 结构体定义在 <sys/epoll.h> 头文件中,主要用于传递文件描述符及其相关的事件类型。

epoll_event 结构体的定义如下:

struct epoll_event {
    uint32_t events; /* Epoll events */
    epoll_data_t data; /* User data variable */
};

下面是 epoll_event 结构体的详细解释:

  1. events:

    • 类型为 uint32_t,用于存储事件的类型掩码。
    • 常见的事件类型包括:
      • EPOLLIN:表示对应的文件描述符可以读。
      • EPOLLOUT:表示对应的文件描述符可以写。
      • EPOLLRDHUP:表示对端关闭连接或者半关闭连接。
      • EPOLLPRI:表示有紧急数据可读(带外数据)。
      • EPOLLERR:表示对应的文件描述符发生错误。
      • EPOLLHUP:表示对应的文件描述符挂起事件。
  2. data:

    • 类型为 epoll_data_t,这是一个联合体(union),可以用于存储用户自定义的数据,比如文件描述符或者指针等。
    • 定义如下:
      typedef union epoll_data {
          void *ptr;
          int fd;
          uint32_t u32;
          uint64_t u64;
      } epoll_data_t;
      
    • 用户可以使用 data 成员来存储与事件相关的自定义数据,如文件描述符、指针、整数等。epoll 在事件触发时会返回该数据,方便用户识别是哪一个文件描述符发生了事件。

下面是一个简单的示例,展示如何使用 epollepoll_event 结构:

cpp
#include <sys/epoll.h>
#include <unistd.h>
#include <stdio.h>

#define MAX_EVENTS 10

int main() {
    int epoll_fd = epoll_create1(0);
    if (epoll_fd == -1) {
        perror("epoll_create1");
        return 1;
    }

    struct epoll_event event;
    event.events = EPOLLIN;
    event.data.fd = STDIN_FILENO;

    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) {
        perror("epoll_ctl");
        close(epoll_fd);
        return 1;
    }

    struct epoll_event events[MAX_EVENTS];
    while (1) {
        int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
        if (num_events == -1) {
            perror("epoll_wait");
            close(epoll_fd);
            return 1;
        }

        for (int i = 0; i < num_events; ++i) {
            if (events[i].events & EPOLLIN) {
                char buffer[1024];
                ssize_t count = read(events[i].data.fd, buffer, sizeof(buffer));
                if (count == -1) {
                    perror("read");
                } else {
                    printf("Read %zd bytes: %.*s\n", count, (int)count, buffer);
                }
            }
        }
    }

    close(epoll_fd);
    return 0;
}

在这个示例中,我们创建了一个 epoll 实例,并将标准输入(STDIN_FILENO)添加到 epoll 监控的事件中。当标准输入有数据可读时,epoll_wait 返回事件,程序读取并打印数据。

总之,epoll_eventepoll 机制中的核心结构,用于描述文件描述符及其相关的事件类型,通过该结构可以实现高效的 I/O 事件通知。

标签:epoll,event,描述符,fd,data,events
From: https://www.cnblogs.com/whcjob/p/18205640

相关文章

  • 允许鼠标响应 css,pointer-events: auto; 和 pointer-events: all; 有什么区别,用哪个
    在CSS中,`pointer-events:auto;`和`pointer-events:all;`实际上并不存在`pointer-events:all;`这个值,因此不用考虑哪个更好。正确的用法是`pointer-events:auto;`。###`pointer-events`属性的概述`pointer-events`属性用于控制一个元素是否响应鼠标事件(如点击、悬停......
  • Unity的UnityEngine.EventSystems中的接口
    一、IPointerDownHandler,IPointerUpHandler,IPointerClickHandler,IPointerEnterHandler,IPointerExitHandlerpublicvoidOnPointerClick(PointerEventDataeventData){Debug.Log("OnPointerClick,鼠标点击,在点击之后抬起时响应");}publicvoidOnP......
  • IO多路复用:Select, Poll与Epoll
    IO多路复用:Select,Poll与Epoll参考:EPOLL原理详解(图文并茂)一、网络数据是如何被接收的网卡接收到网络数据将网络数据暂存到内存当中(DMA传输技术)网卡向CPU发起硬件中断CPU执行中断处理函数,将内存中的数据存储到socket文件描述符中,并唤醒相关进程Q1:如何知道要将网络数据......
  • 10046 event
    转自:https://www.cnblogs.com/dbabd/p/10319479.html#autoid-3-0-01.前言作为SQLTrace的扩展功能,Oracle10046event(10046事件)是一个重要的调试事件,也可以说是系统性能分析时最重要的一个事件,它包含比SQLTrace更多的信息。但可惜的是,10046事件并不是Oracle官方提供给用户的......
  • LeetCode 1353. Maximum Number of Events That Can Be Attended
    原题链接在这里:https://leetcode.com/problems/maximum-number-of-events-that-can-be-attended/description/题目:Youaregivenanarrayof events where events[i]=[startDayi,endDayi].Everyevent i startsat startDayi andendsat endDayi.Youcanattend......
  • ❤️‍ Solon Cloud Event 新的事务特性与应用
    1、SolonCloudEvent?是Solon分布式事件总线的解决方案。也是Solon“最终一致性”分布式事务的解决方案之一2、事务特性事务?就是要求Event有原子性,当多个Event发布时,要么全成功,要么全失败。publicclassEventDemo{publicvoidevent_tran(){//新建......
  • epoll、poll、select
    `epoll`、`select`和`poll`都是在Linux系统中用于实现I/O多路复用的机制,它们都能够实现在多个文件描述符上进行非阻塞的I/O操作,并在有I/O事件发生时通知应用程序。以下是它们的一些比较:1.**`select`**:-`select`是Unix系统最早的一种多路复用机制之一。-它......
  • 事件循环(event loop)原理,并类比理解qt的信号(Signal)和槽(Slot)机制)
    背景:实际项目中要使用pyqt/pyside技术,涉及到qt和asyncio的事件循环,并需要使用到qt的信号(Signal)和槽(Slot)机制,从底层了解事件循环的原理使得后续工作更好入手。事件循环是什么?事件循环(EventLoop)是一种用于处理和调度异步任务的机制。它通常用于编写异步编程,特别是在处理IO密......
  • ohohoh--IO多路复用之最后一个epoll
    通知:epoll是仅限于在Linux上的函数->其正常流程可参考其他的,这里不多赘述,我主要想说的是非阻塞的套接字边缘模式多线程epoll(很绕,我懂)。。。先上源代码#include<iostream>#include<string.h>#include<arpa/inet.h>#include<sys/select.h>#include<sys/epoll.h>#include......
  • Camunda 流程执行错误处理ERROR BOUNDARY EVENT
     ERRORBOUNDARYEVENT:在任务发生异常时候会触发走,在代码中必须显式抛出thrownewBpmnError("error.....");publicvoidexecute(DelegateExecutiondelegateExecution)throwsException{System.out.println("进来了>>>>>>>>>>>>&......