两个同时运行的linux程序和按键捕获

时间:2015-01-28 13:36:54

标签: c linux

我有一个在Raspberry Pi(linux)上运行的OpenVG数字标牌应用程序。不幸的是,让它在循环中显示全屏.jpg背景会减慢很多东西。

所以我去了透明背景,我的OpenVG程序在第1层运行。然后,我也启动了FBI(一个在framebuffer中显示图像的shell程序)。这样我就有了相同的视觉效果,但在OpenVG程序中也有很大的加速,就像覆盖层一样,在我的情况下非常重要。要同时启动两个程序,我使用以下命令:

fbi -noverbose bg.jpg | ./digital-signage

( - noverbose参数使fbi不显示UI,只显示全屏图像)

问题是,我希望能够在我的OpenVG应用程序中捕获和处理按键。它的代码如下所示:

void changemode(int dir) {
    static struct termios oldt, newt;

    if (dir == 1) {
        tcgetattr( STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newt);
    } else {
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
    }   
}

int kbhit(void) {
    struct timeval tv;
    fd_set rdfs;

    tv.tv_sec = 0;
    tv.tv_usec = 0;

    FD_ZERO(&rdfs);
    FD_SET(STDIN_FILENO, &rdfs);

    select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
    return FD_ISSET(STDIN_FILENO, &rdfs);
}

int main(int argc, char **argv) {
    char key = 0;

    changemode(1);
    while (!kbhit()) {
        // do the rendering here until a key is pressed
    }
    key = getchar();
    changemode(0);
    finish(); 

    printf("%c", key);
    return 0;
}

正如您所看到的,程序将循环直到检测到按键,然后它会回显键并退出。当我只运行OpenVG应用程序时,它工作正常:

./digital-signage

但是当我这样做的时候......

fbi -noverbose bg.jpg | ./digital-signage

密钥总是错误的,因为fbi似乎捕获了输入(并且它正确,因为它对键盘快捷键做出反应)。 程序退出但检测到错误的密钥。

我的问题是我不需要联邦调查局对任何事情做出反应。我需要我的OpenVG应用程序来正确处理按键。有没有办法实现它?

0 个答案:

没有答案