我想知道如何使用container_of设置epoll。我正在使用最新版本的ubuntu和eclipse-cdt(gcc)。我的想法是抓住事件,然后抓住事件来自的容器。
如果我有这样的结构:
struct client {
int s;
struct epoll_event e;
}foo;
然后......:
struct epoll_event *events = NULL;
struct client *c = NULL;
foo.s = (socket);
int efd = epoll_create1(0);
foo.e.data.fd = foo.s;
foo.e.events = EPOLLIN;
epoll_ctl ( efd , EPOLL_CTL_ADD , foo.s , &foo.e );
events = (struct epoll_event*)calloc ( XXX , sizeof event );
while(1) {
int n = epoll_wait ( efd , events , XXX , -1 );
for ( int i = 0 ; i < n ; i++ ) {
c = container_of ( events[i] , client , e );
我该怎么办?谢谢!
答案 0 :(得分:2)
好吧,首先events[i]
不是指针。要获取指针,请使用events + i
或&events[i]
。
其次,数组中的epoll_event
结构与epoll_event
结构中的client
结构不同,这意味着您无法使用container_of
。< / p>
container_of
用法的有效示例:
client c;
epoll_event *ep = &c.e;
client *cp = container_of(ep, client, e);
如您所见,第一个参数必须指向您要访问的“容器”中的实际成员。在此cp
将指向c
。
在你的情况下你想要一个指针(正如我上面所说,实际上并不是一个指针),不指向client
结构中的成员,并且不行。