带有container_of的C ++ epoll

时间:2012-08-10 03:12:59

标签: c++ epoll

我想知道如何使用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 );

我该怎么办?谢谢!

1 个答案:

答案 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结构中的成员,并且不行。