2012-10-03 22 views
3

我正在使用epoll來獲取有關傳入數據的通知。這並不難,因爲所有由epoll_wait()返回的事件表明,我可以從epoll_event.data.fd(套接字描述符)讀取數據。如何區分同一套接字上的讀寫事件?

但現在我要得到這兩種類型的通知:接收和發送(套接字可用於發送)。但我不能這樣做,因爲:

  1. epoll_event.events這是由epoll_wait()返回是一樣的我通過在epoll_ctl()。所以在我的情況下它包含EPOLLINEPOLLOUT
  2. 另外,如果我想在epoll兩次加一個插座(如EPOLLIN和EPOLLOUT事件),我會得到一個EEXIST

如何在每次收到通知時手動調用select()來解決此問題?

+0

(EPOLLIN | EPOLLOUT) – wildplasser

回答

4

man epoll_wait,明確指出「事件成員將包含返回的事件位字段。」因此,如果您在epoll_event.events中獲得EPOLLIN | EPOLLOUT,那麼您的套接字必須準備好讀取和寫入。

如果你只想得到通知時,插座變化狀態,使用EPOLLET爲邊沿觸發操作。

2

使用epoll_ctl添加描述符時,請將events掩碼設置爲EPOLLIN | EPOLLOUT

當您通過epoll_wait收到通知時,您將循環返回通知,檢查EPOLLINEPOLLOUT

僞代碼

int index, count; 
count = epoll_wait(epfd, epoll_event, MAX_EVENTS, -1); 
for (index = 0; index < count; ++index) { 
    if (epoll_event[index].events & EPOLLIN) { 
    // Ready for read 
    } 

    if (epoll_event[index].events & EPOLLOUT) { 
    // Ready for write 
    } 
} 

有些人只設置EPOLLOUT位當他們出現在他們的發送緩衝區的數據。我沒有包含任何錯誤檢查。