我想监视一个在一个终端窗口上运行的交互式 C 程序(比如 program1)。并将输入作为数字(0-9)
正如我所期望的监控:当我向program1(在单独的终端上运行)提供输入时,我的观察者应该检测到按键被按下(从单独的终端)。
为此,我必须编写一个 C 程序 (observer_prog.c),它将在单独的终端上执行,等待来自 program1 的活动。
我为 GCC 编译器 kbhit() 函数实现了以下链接中的建议。但它无法检测到来自不同终端执行的击键。
无论如何我可以改进这个现有的模块,或者任何其他解决方法?
观察者计划
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <termios.h>
#include <stdlib.h>
static struct termios g_old_kbd_mode;
static int kbhit(void){
struct timeval timeout;
fd_set read_handles;
int status;
// check stdin (fd 0) for activity
FD_ZERO(&read_handles);
FD_SET(0, &read_handles);
timeout.tv_sec = timeout.tv_usec = 0;
status = select(0 + 1, &read_handles, NULL, NULL, &timeout);
return status;
}
static void old_attr(void){
tcsetattr(0, TCSANOW, &g_old_kbd_mode);
}
void press(){
printf("Pressed !!!\n");
}
// main function
int main( void ){
char ch;
static char init;
struct termios new_kbd_mode;
if(init)
return 0;
// put keyboard (stdin, actually) in raw, unbuffered mode
tcgetattr(0, &g_old_kbd_mode);
memcpy(&new_kbd_mode, &g_old_kbd_mode, sizeof(struct termios));
new_kbd_mode.c_lflag &= ~(ICANON | ECHO);
new_kbd_mode.c_cc[VTIME] = 0;
new_kbd_mode.c_cc[VMIN] = 1;
tcsetattr(0, TCSANOW, &new_kbd_mode);
atexit(old_attr);
while (!kbhit()){
if(kbhit()){
press();
exit(1);
}
}
return 0;
}