C 两个同时运行的linux程序和按键捕捉
我有一个在Raspberry Pi(linux)上运行的OpenVG数字看板应用程序。不幸的是,让它在一个循环中全屏显示.jpg背景会大大降低速度 所以我选择了透明的背景和运行在第1层的OpenVG程序。然后,我还启动了FBI(一个在帧缓冲区中显示图像的shell程序)。这样我就有了同样的视觉效果,但OpenVG程序的运行速度也大大提高了,就像一个覆盖层一样,这在我的例子中非常重要。要同时启动两个程序,我使用以下命令:C 两个同时运行的linux程序和按键捕捉,c,linux,C,Linux,我有一个在Raspberry Pi(linux)上运行的OpenVG数字看板应用程序。不幸的是,让它在一个循环中全屏显示.jpg背景会大大降低速度 所以我选择了透明的背景和运行在第1层的OpenVG程序。然后,我还启动了FBI(一个在帧缓冲区中显示图像的shell程序)。这样我就有了同样的视觉效果,但OpenVG程序的运行速度也大大提高了,就像一个覆盖层一样,这在我的例子中非常重要。要同时启动两个程序,我使用以下命令: fbi -noverbose bg.jpg | ./digital-sign
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似乎捕捉到了输入(而且它正确地捕捉到了,因为它对键盘快捷键有反应)程序退出,但检测到不正确的密钥。
我的问题是我不需要fbi对任何事情做出反应。我需要我的OpenVG应用程序来正确处理按键。有什么方法可以实现吗?fbi-noverbose bg.jpg的数字标牌有什么问题?ioctl VT_GETSTATE:设备的ioctl不合适(不是linux控制台?)OpenVG应用程序启动了,但fbi没有启动。那么,fbi-noverbose bg.jpg&然后是
/digital signage
?在第一个命令后,屏幕变为空白,我除了重新启动Pi外,什么也做不了。