首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数在epoll_event结构中的意义(epoll)

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

Stack Overflow用户
提问于 2014-07-08 10:56:43
回答 2查看 7.4K关注 0票数 9

我使用的是epoll_ctl()和epoll_wait()系统调用。

代码语言:javascript
复制
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时,我可以使用联合epoll_data来指定fd。一种方法是在"fd“成员中指定它。另一种方法是在我自己的结构中指定它,"ptr“成员将指向该结构。

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

我仔细检查了内核系统调用的实现,发现了以下内容:

  1. epoll_ctl初始化epoll_event并将其存储(以某种RB树格式)
  2. 当fd准备就绪时,epoll_wait返回填充在epoll_ctl中的epoll_event。在此之后,我可以识别准备就绪的fd。我不明白"u32“和”u64“的用法。
EN

回答 2

Stack Overflow用户

发布于 2014-07-16 16:35:21

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-07-08 16:50:50

epoll_data的字段没有任何预定义的含义;您的应用程序会分配一个含义。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24622982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档