select()无法正常工作,错误在哪里?

select()无法正常工作,错误在哪里?,c,linux,select,C,Linux,Select,给定以下代码,每次调用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 */ in

给定以下代码,每次调用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);
    }
}
为什么除第一次调用外,所有要选择的调用都会立即返回

编译器:GCC4.9.2

操作系统:Centos 7 Linux

内核信息:3.10.0-327.36.3.el7.x86_64

在Linux上,选择modifies timeout(修改超时)以反映未超时的时间量 睡大多数其他实现都不这样做。POSIX.1许可证 无论是哪种行为。当Linux代码 读取超时被移植到其他操作系统,并且当代码 移植到Linux,可对多个选择重复使用struct timeval 在循环中,无需重新初始化。考虑超时时间 选择返回后罚款

由于第一次运行以超时结束,tv值重置为0秒。解决方案:每次跑步时重新初始化电视。

从手册页:

在Linux上,选择modifies timeout(修改超时)以反映未超时的时间量 睡觉

因此,在调用select(选择)之前,请先设置电视[在循环中]

以便更好地使用。顺便说一句,我更喜欢旧的选择