1
與監聽套接字打交道是從man epoll
頁:通過以下所有epoll的
功能do_use_fd()使用新的 準備文件描述符 直到EAGAIN由要麼讀返回(2)或write(2) 。爲ET
代碼示例觸發:
for(;;) {
nfds = epoll_wait(kdpfd, events, maxevents, -1);
for(n = 0; n < nfds; ++n) {
if(events[n].data.fd == listener) {
client = accept(listener, (struct sockaddr *) &local,
&addrlen);
if(client < 0){
perror("accept");
continue;
}
setnonblocking(client);
ev.events = EPOLLIN | EPOLLET;
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = client;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
fprintf(stderr, "epoll set insertion error: fd=%d\n",
client);
return -1;
}
}
else
do_use_fd(events[n].data.fd);
}
}
所以對於read/write
操作,我們應該循環,直到一個EAGAIN
收到做到這一點,但爲什麼它不是accept
的情況?
IMO上面的代碼會錯過一些申請時有很多種客戶端套接字等待被接受,因爲它僅接受客戶端套接字,我們也應該把它包在一個循環,直到收到EAGAIN
。
或者是否有我失蹤的東西?
@mat,如果在ET模式('| EPOLLET')中將'listen_sock'添加到epollfd中,你將如何處理它?我上面的代碼是錯的,對吧? –
手冊頁中的代碼是正確的,因爲它不會在偵聽器套接字上設置ET模式。如果您在ET模式下添加監聽器,那麼您需要採取額外的預防措施並循環,直到EAGAIN。雖然要小心飢餓。 – Mat
@Mat,就是從'man epoll'頁面引用'listen_sock'的上述代碼嗎? –