代码样例一(正确用法):
while (true) {
FD_ZERO(&readfds);
FD_SET(socket_fd, &readfds);
time_wait.tv_sec = 0;
time_wait.tv_usec = 500000;
ret = select(socket_fd+1, &readfds, NULL, NULL, &time_wait);
if ((ret <= 0) || (!FD_ISSET(socket_fd, &readfds))) {
continue;
}
// TODO: read socket
}
代码样例二(错误用法):
time_wait.tv_sec = 0;
time_wait.tv_usec = 500000;
while (true) {
FD_ZERO(&readfds);
FD_SET(socket_fd, &readfds);
ret = select(socket_fd+1, &readfds, NULL, NULL, &time_wait);
if ((ret <= 0) || (!FD_ISSET(socket_fd, &readfds))) {
continue;
}
// TODO: read socket
}
select()传入的第5个参数,time_wait变量是传入的指针,select()函数内部会改变此参数的值,以供调用者获得select()的执行耗费时长。
因此,第5个参数必须每次调用select()之前重新赋值,否则会使select()函数执行阻塞时间为0。从而导致该线程一直占用cpu资源。