epoll_event

ponder776發表於2024-05-22

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 事件通知。