轮询文件描述符

时间:2010-08-31 03:43:49

标签: linux embedded-linux

对于嵌入式MIPS平台我正在实现一个小程序来轮询GPIO,即我正在使用具有基本功能的芯片供应商的用户级GPIO库(打开/ dev / gpio,读取,写入引脚等)。设计很简单:

int gpio_fd;
fd_set rfds;

gpio_fd = gpio_open(...);

while (1) {
    FD_ZERO(&rfds);
    FD_SET(gpio_fd, &rfds);

    if (select(gpio_fd + 1, &rfds, NULL, NULL, NULL) > 0) {
        if (FD_ISSET(gpio_fd, &rfds)) {
            /* read pins and similar */
        }
    }
}

但是我面临一个严重的问题 - 这个应用程序与'&'一起运行时最后,即把它放在后台,消耗99%的CPU,这显然是因为紧密的循环,但我在许多网络代码中观察到类似的方法,它工作正常。

我错过了什么,这可能是gpio库的缺陷吗?

实际上,只有一个“while(1);”也会产生同样的效果。它可以是内核的“自然”行为吗?

感谢。

1 个答案:

答案 0 :(得分:1)

select调用应该阻塞,直到文件描述符可读。

可能发生的情况是设备驱动程序不支持select调用,因此它会立即退出而不是阻止。

另一种可能性是对gpio_open的调用实际上并没有给你一个真正的Unix文件描述符。如果那是open("/dev/gpio", O_RDWR)或类似的东西,我会更加相信它。