考虑到以下代码,期望每次调用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
OS:Centos 7(Linux)
内核信息:3.10.0-327.36.3.el7.x86_64
答案 0 :(得分:6)
从手册页:
在Linux上,select()修改超时以反映未经过的时间 睡
因此,在调用tv
select
[在循环中]
答案 1 :(得分:5)
在Linux上,select()修改超时以反映未经过的时间 睡觉;大多数其他实现不会这样做。 (POSIX.1允许 无论是行为。)这导致Linux代码时出现问题 读取超时被移植到其他操作系统,当代码是 移植到Linux,为多个select()s重用struct timeval 在没有重新初始化的循环中。考虑超时是不 select()返回后被罚款。
当第一次运行以超时结束时,tv值重置为0秒。解决方案:每次运行时重新初始化电视。