关于epoll_wait的返回机制

时间:2014-11-14 02:53:33

标签: c epoll

我已经看过使用epoll_wait的所有epoll exmaples

int i, n;
...
n = epoll_wait(epfd, events, MAX_EVENTS, -1);
for (i = 0; i < n; ++i) {
    do_something_with(events[i]);
}

我将其更改为

int i;
...
for (i = 0; i < epoll_wait(epfd, events, MAX_EVENTS, -1); ++i) {
    do_something_with(events[i]);
}

当套接字连接到此程序并发送内容时,epoll_wait将仅返回一次,具有连接操作,但在此之后无法读取(先前版本,两次,连接和读取)。这有什么神奇之处?

完整的C代码位于http://pastebin.com/bx4hbhdM

Python客户端

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 4999))
s.sendall('hello')
s.close()

1 个答案:

答案 0 :(得分:1)

更改后的版本会在每次循环迭代时调用epoll_wait,因此在仅处理一个事件后再次阻塞。你必须先预先调用epoll_wait,然后再进行循环。