select() 没有正常工作,错误在哪里?

问题描述 投票:0回答:2

给出以下代码,期望每次调用

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

c linux posix-select
2个回答
6
投票

来自手册页:

在 Linux 上,select() 修改超时以反映未执行的时间量 睡了

因此,在调用

tv
 之前设置 
select

[在循环中]

5
投票

手册页

中所述

在 Linux 上,select() 修改超时以反映未执行的时间量 睡了;大多数其他实现不会这样做。 (POSIX.1 允许 这两种行为都会导致问题。 读取超时被移植到其他操作系统,并且当代码是 移植到 Linux,为多个 select() 重用 struct timeval 循环中而不重新初始化它。考虑超时是不合理的 select() 返回后被罚款。

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

© www.soinside.com 2019 - 2024. All rights reserved.