1

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

我怎么能做这样的事情?谢谢!

4

1 回答 1

2

好吧,首先events[i]不是指针。要获取指针,请使用events + i&events[i]

其次,epoll_event数组中的结构与epoll_event结构中的client结构不同,这意味着你不能使用container_of.

一个有效的container_of用法示例:

client c;
epoll_event *ep = &c.e;

client *cp = container_of(ep, client, e);

如您所见,第一个参数必须指向您要访问的“容器”中的实际成员。在这之后cp会指向c

在您的情况下,您想要一个不指向结构中成员的指针(正如我上面所说,实际上不是指针),client这将不起作用。

于 2012-08-10T05:42:06.803 回答