Linux socket accpet 对应的内核结构 https://blog.youkuaiyun.com/u010039418/article/details/80628490
Linux socket https://blog.youkuaiyun.com/u010039418/article/details/80628490
epoll 的两种用法: https://www.cnblogs.com/ccccccccc/p/3963392.html
下面我们再来看看epoll_event的结构:
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; // Epoll events
epoll_data_t data; // User data variable
};
请重点关注epoll_data_t这个字段。这个字段是一个联合体,联合体在同一时间只有一个成员变量,联合体占用的内存大小为所有成员中占用字节最大的成员决定,在此处,就是类型为uint_64_t 的u64。
原始epoll结构有一个很大的麻烦,fd字段放在了epoll_data_t结构 ,这就使得在使用的时候,我们不得不在fd与用户自己的数据之间做一个抉择,关键是fd不能少,少了也就失去 epoll的意义。选择保存用户数据到epoll_data_t中,那么我们自定义 的结构中一定要包含fd,但是请注意,用户自定义的数据此时只能保存一个地址,即保存在指针*ptr中。常规的编程中,我们发现,几乎所有的epoll结构都没有自定义用户数据,即使定义了,对epoll的使用也不得不变得麻烦,并且用户不得不为每一个epoll注册申请一个 内存空间(本人目前没有发现更好的办法,如果不申请内存,那么只能用全局或静态变量)。当有大量服务连接的时候,每次触发epoll机制都不得不重新根据ptr来获取自定义结构内存,这样难免会影响epoll服务器的性能,即使内核对epoll已经足够优化,用户自己查找的过程中,还是必不可少的增加了时间,间接或直接地降低了epoll的效率。
参考:https://blog.youkuaiyun.com/qq_33195791/article/details/81838444