select()不能正常工作,bug在哪里?

Mic*_*eyn -2 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 */
        int result=select(0, NULL, NULL, NULL, &tv);
        printf("select returned: %d\n",result);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么所有的电话select()除了第一次立即返回?

编译器:gcc 4.9.2

操作系统:Centos 7(Linux)

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

Cra*_*tey 6

从手册页:

在Linux上,select()修改超时以反映未睡眠的时间

所以,tv在调用之前设置[在循环中]select


fvu*_*fvu 5

联机帮助页所述

在Linux上,select()修改超时以反映未睡眠的时间; 大多数其他实现不会这样做.(POSIX.1允许任何一种行为.)当读取超时的Linux代码移植到其他操作系统时,以及当代码移植到Linux时,在循环中为多个select()重用struct timeval而不重新初始化它时,这会导致问题.考虑在select()返回后定义超时.

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