对,是死循环。以 select
为例,源码的关键部分是:
for (;;) {
unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;
inp = fds->in; outp = fds->out; exp = fds->ex;
rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;
for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
// 省略代码
}
// 省略代码
if (retval || timed_out || signal_pending(current)) {
break;
}
if (table.error) {
retval = table.error;
break;
}
}
所以说 epoll
效率比 select
高啊。
P.S. 其实效率低主要倒不是因为死循环,而是频繁的内核态和用户态切换。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…