2014-04-09 3 views
0

epoll에서 작동하는 두 개의 스레드가 있습니다. 하나의 스레드가 서버에 대한 TCP 연결을 시도하고 EPOLL_CTL_ADD 옵션을 사용하여 소켓을 epoll-fd에 추가합니다.Epoll : SD가 epoll-fd에 추가되면 이벤트의 실제 SD 값과 다릅니다.

또 다른 스레드는 epoll-fd에 추가 된 SD에서 이벤트 대기를 담당합니다.

스레드 1 :

establish_tcp_conn() 
{ 
    struct epoll_event event; 

    sd = socket(AF_INET,SOCK_STREAM,0); 
    fcntl(sd, F_SETFL, O_NONBLOCK); 
    connect(sd,(struct sockaddr *)&servaddr, sizeof(servaddr)); 

    event.events = EPOLLOUT | EPOLLIN | EPOLLRDHUP | EPOLLERR | EPOLLET ; 

    event.data.fd = sd; 
    event.data.ptr = data; //user data 

    epoll_ctl((int)g_epfd, EPOLL_CTL_ADD, sd, &event) ; // successful 
      ...... 

} 

스레드 2 :

void * sock_thread() 
{ 
    n = epoll_wait(g_epfd, events, MAX_SOCKETS, -1); 
    ... 
} 

A 이벤트는 sdg_epfd에 추가에, 나는 sd != events[i].data.fd 볼 발생합니다. events[i].data.fd의 값은 부당한 값을 포함합니다. 그러나 correctly.Also 이벤트를 검출하고, event.data에 부착 된 사용자 데이터가 왜 events[i].data.fdEPOLL_CTL 첨가 한 것 sd 동일하지이다 events[i].data.ptr

에서 잘 얻어?

답변

2

epoll.data은 노조입니다 (http://linux.die.net/man/2/epoll_wait 참조). 즉, fd 또는 데이터 포인터 중 하나만 추가 할 수 있지만 둘 다 추가 할 수는 없습니다.

+0

아아! 감사합니다 @ cmeerw! – Prabhu

관련 문제