epoll_event结构(epoll)中参数的意义

时间:2014-07-08 02:56:43

标签: linux linux-kernel epoll

我正在使用epoll_ctl()和epoll_wait()系统调用。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

struct epoll_event {
    uint32_t events; /* epoll events (bit mask) */
    epoll_data_t data; /* User data */
};


typedef union epoll_data {
     enter code here`void *ptr; /* Pointer to user-defined data */  
     int fd; /* File descriptor */  
     uint32_t u32; /* 32-bit integer */  
     uint64_t u64; /* 64-bit integer */  
} epoll_data_t;

使用epoll_ctl时,我可以使用union epoll_data来指定fd。一种方法是在“fd”成员中指定它。另一种方法是在我自己的结构中指定它,“ptr”成员将指向结构。

“u32”和“u64”有什么用?

我经历了内核系统调用实现并发现了以下内容:
1. epoll_ctl初始化epoll_event并将其存储(以某种RB树格式) 2.当fd准备就绪时,epoll_wait返回epoll_ctl中填充的epoll_event。在此之后,我可以识别准备就绪的fd。我不明白“u32”和“u64”的目的。

2 个答案:

答案 0 :(得分:4)

预定义的联合用于方便使用,您通常只使用其中一个:

  • 如果要存储指针
  • ,请使用ptr
  • 如果要存储套接字描述符
  • ,请使用fd
  • 如果要存储通用/不透明的32/64位数
  • ,请使用u32 / u64

实际上,epoll_data是与套接字事件关联的64位数据,您可以存储任何内容来查找事件处理程序,因为epoll_wait只返回两件事:事件&关联的epoll_data。

答案 1 :(得分:2)

epoll_data的字段没有任何预定义;你的应用程序赋予了意义。

任何字段都可用于存储应用程序识别事件所需的信息。 (u32u64可能对数组索引有用。)