2014-04-09 58 views
0

我有兩個線程可以在epoll上運行。一個線程嘗試TCP連接到服務器,並使用EPOLL_CTL_ADD選項將套接字添加到epoll-fd。Epoll:添加到epoll-fd的SD與事件的實際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); 
    ... 
} 

當一個事件發生在sd加入g_epfd,我看到sd != events[i].data.fdevents[i].data.fd的值包含不合理的值。但檢測correctly.Also的情況下,這是連接到event.data用戶數據被爲什麼events[i].data.fd不一樣sd,將其用加入EPOLL_CTL得到的細從events[i].data.ptr

回答