1

container_of を使用して epoll を設定する方法を考えていました。eclipse-cdt (gcc) で最新バージョンの ubuntu を使用しています。私のアイデアは、イベントを取得してから、イベントが発生したコンテナーを取得することでした。

次のような構造体がある場合:

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_eventclientcontainer_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 に答える