当暴露于高CPU利用率时,Linux fread()调用USB设备会冻结

时间:2017-11-22 23:55:41

标签: c linux

最近,我为一款名为" Boogie Board RIP"能够将它用作linux的输入设备。它可以通过USB连接到计算机。当提供的笔靠近或触摸设备的屏幕时,它将发送数据告知笔在屏幕上的位置。

基本上司机工作得很好。我可以写上它就像是一台wacom数位板。

在不可预测的时间,程序将挂在下面一行,我的电脑屏幕上的光标将保持不变

fread(packet, sizeof(char), BYTES, f);

其中:

  • "分组"是一个8字节的数组
  • " BYTES"是8
  • " F"是以二进制读(rb)模式打开的文件。就我而言,它是/dev/usb/hiddev0

基本程序布局是一个while循环,一次读取一个字节。下面是一个更大的事情的模型:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

    char *path = argv[1];
    unsigned char packet[8];
    FILE *f = fopen(path, "rb");
    int i;

    while (1) {
        fread(packet, sizeof(char), 8, f);
        for(i=0;i<8;i++) {
            printf("%x", packet[i]);
            fflush(stdout);
        }

    }
}

我开始注意到我的司机会&#34;冻结&#34;更常见的是当我运行更多的东西,比如看youtube,播放音乐......这些都不是很好的例子。基本上我开始怀疑它与CPU利用率有关。所以我写了下面的程序来测试它:

#include <stdio.h>

int main() {
    while(1) {
        printf("a");
        fflush(stdout);
        fflush(stdout);
        fflush(stdout);
        fflush(stdout);
        fflush(stdout);
        fflush(stdout);
        fflush(stdout);
    }
}

运行此&#34;无限循环&#34;在另一个终端上运行上面的另一个程序时,在一个单独的终端中编程将导致严重的更频繁的冻结。基本上程序将在2秒内在fread()行停止。

我了解到,当对fread()的调用没有获得任何数据时,我仍然可以使用该程序的另一个实例从设备中读取数据,或者只是通过sudo cat /dev/usb/hiddev0打印出文件的内容。原始进程仍然卡住,而新程序将吐出来自设备的数据。

好像文件只是关闭了。但这没有任何意义,因为在下次阅读时,fread会出现段错误。寻找任何想法。

0 个答案:

没有答案