2012-08-10 3 views
1

나는 epoll을 container_of로 설정하는 방법을 궁금해했다. 나는 eclipse-cdt (gcc)와 함께 최신 버전의 우분투를 사용하고있다. 내 생각은 이벤트를 잡아서 이벤트가 발생한 컨테이너를 가져 오는 것입니다.C++ epoll with container_of

내가 지금과 같은 구조체가있는 경우 : 다음

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); 

어떻게 이런 일을 할 수 있습니까? 감사!

답변

2

음, 우선 events[i]은 (는) 포인터가 아닙니다. 포인터를 얻으려면 events + i 또는 &events[i]을 사용하십시오. 둘째

어레이의 epoll_event 구조는 container_of을 사용할 수없는 수단 client 구조의 epoll_event 구조와 동일하지 않다.

container_of 사용의 올바른 예 : 당신이 볼 수 있듯이

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

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

는 첫 번째 인수는 "컨테이너"당신이 도달 할에 실제 멤버를 가리켜 야합니다. 이 후 cpc을 가리 킵니다. 귀하의 경우에는

당신은 포인터를 먹고 싶어 (그리고 제가 위에서 말했듯이, 실제로는 포인터가 아닌) client 구조의 멤버로하지 점을한다는 것을, 그리고이 작동하지 않습니다.

+0

올바르게 이해하고 있다면 events [0] (이벤트)가 "struct epoll_event"가 아닌가요? 나는 container_of가 어떻게 작동하는지보고, 내가하고 싶은 것을 어떻게 성취 할 수 있는지 생각하고 있니? – User

+0

@Ohmages'events [0]'은 _pointer_가 아닙니다. 더 중요한 것은 '클라이언트'구조의 멤버에 대한 포인터가 아니라는 것입니다. –

+0

아, 알았어. 흠. 글쎄요, 이것은 분명히 도로에 충돌을 일으 킵니다. 나는 내가 원하는 것을 할 수있는 일종의 방법이 있기를 바랐다. 당신의 응답을 주셔서 감사합니다. 내가보고 싶었던 것은 아니지만, 적어도 container_of는 모두 삭제되었습니다. :) – User