發表文章

目前顯示的是 8月, 2012的文章

epoll - I/O event notification facility

最近要 寫一 支 Network Service Daemon 的程式,本來想用 select 來寫,後來印象中有看過其他的解決方案,所以就稍微查了一下,於是就發現了今天的主角 ~ epoll 。epoll 是一套在 Linux 2.6上推出的 I/O Event 機制(其實是2.5.44,但因為我只看穩定版的關係,所以直接寫2.6)。 和 select 或是 poll 機制比起來,epoll 最大的優點是 它只會對Active的FD進行操作 。什麼叫作只會對 Active 的 FD 進行操作?回想一下在寫 select 的程式時, 總是會寫一個迴圈去掃描所有 FDSET 裏面的成員,去找到到底是哪一個 FD 有事件發生 ,而在epoll 裏面就不會這樣,它只會回傳有在運作的FD_SUBSET,實作的方式以後再研究吧,不過聽說是根據 FD 的 callback 函式有沒有被呼叫進行判別。其他的優點像是避開了select 的 FD_SETSIZE 限制之類的就不提了,因為感覺上這個參數是可以被改大的。 epoll 的函式只有三個: int epoll_create ( int size ); int epoll_ctl ( int epfd, int op, int fd, struct epoll_event *event ); int epoll_wait ( int epfd, struct epoll_event *events, int maxevents, int timeout ); 看名字並不難理解,所以就不加說明了,有問題就看下面的範例吧。下面是一支使用 epoll 的 TCP Echo Server 程式。Client 端就不附上了,反正改改也就是了。 # include < stdio.h > // for printf() and fprintf() # include < sys/socket.h > // for socket(), bind(), and connect() # include < arpa/inet.h > // for sockaddr_in and inet_ntoa() # include < st