的epoll的手冊頁:epoll的與邊沿觸發事件
http://linux.die.net/man/7/epoll
有邊緣的樣本代碼觸發像follwoing:
for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_pwait");
exit(EXIT_FAILURE);
}
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &local, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].data.fd);
}
}
}
在功能do_use_fd,我呼籲在未封閉的recv while循環直到EAGAIN,示例代碼工作正常 , 我有一個關於這個示例代碼的問題,現在假設我有50個套接字客戶端連接,突然有10個客戶端同時寫入數據,所以epoll_wait()將返回10,然後去爲循環:
for (n = 0; n < nfds; ++n)
它會調用do_use_fd(事件[N] .data.fd);對於這10個客戶端,假設n = 5完成,並且n = 6尚未完成,突然事件n = 3的文件描述已經接收到新數據,在所有10個事件完成並返回到epoll_wait後,I得到事件告訴我有一個客戶有新的數據要讀?或者我會錯過它,因爲事件發生時,代碼不在epoll_wait!
...和'eventfd's和'超出你的想象timerfd's你少。 – Damon
謝謝cmeerw,你幫了很多忙! – barfatchen