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

时间:2018-03-27 16:07:59

标签: 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);
    }
}

除了第一次回复之外,为什么所有对select()的所有电话都会立即返回?

编译器:gcc 4.9.2

OS:Centos 7(Linux)

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

2 个答案:

答案 0 :(得分:6)

从手册页:

  

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

因此,在调用tv

之前设置select [在循环中]

答案 1 :(得分:5)

the manpage

中所述
  

在Linux上,select()修改超时以反映未经过的时间          睡觉;大多数其他实现不会这样做。 (POSIX.1允许          无论是行为。)这导致Linux代码时出现问题          读取超时被移植到其他操作系统,当代码是          移植到Linux,为多个select()s重用struct timeval          在没有重新初始化的循环中。考虑超时是不          select()返回后被罚款。

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