给出以下代码,期望每次调用
select()
时都会有一秒钟的睡眠。但是,睡眠仅发生在第一次调用时,所有后续调用都不会导致延迟:
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
for (;;)
{
/* Sleep for one second */
int result=select(0, NULL, NULL, NULL, &tv);
printf("select returned: %d\n",result);
}
}
为什么除了第一个之外所有对
select()
的调用都会立即返回?
编译器:gcc 4.9.2
操作系统:Centos 7 (Linux)
内核信息:3.10.0-327.36.3.el7.x86_64
来自手册页:
在 Linux 上,select() 修改超时以反映未执行的时间量 睡了
因此,在调用
tv
之前设置
select
[在循环中]
如手册页
中所述在 Linux 上,select() 修改超时以反映未执行的时间量 睡了;大多数其他实现不会这样做。 (POSIX.1 允许 这两种行为都会导致问题。 读取超时被移植到其他操作系统,并且当代码是 移植到 Linux,为多个 select() 重用 struct timeval 循环中而不重新初始化它。考虑超时是不合理的 select() 返回后被罚款。
由于第一次运行因超时而结束,tv 值重置为 0 秒。解决方案:每次运行时重新初始化电视。