【发布时间】:2014-08-28 16:00:16
【问题描述】:
我正在使用 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”的目的。
【问题讨论】:
标签: linux linux-kernel epoll