Я хочу отслеживать интерактивную программу на C (скажем, program1), которая работает в одном окне терминала.и принимает входные данные в виде числа (0-9)
Как и при мониторинге, я ожидаю: когда я предоставлю вход для программы 1 (работающей на отдельном терминале), мой наблюдатель должен обнаружить, что клавиша нажата (с отдельного терминала).
Чтобы добиться этого, мне нужно написать программу на C (Observer_prog.c), которая будет выполняться на отдельном терминале в ожидании действий из программы1.
Я реализовал приведенные ниже ссылки для функции компилятора GCC kbhit ().Но он не может обнаружить нажатия клавиш от различных исполнений терминала.
kbhit () реализация для gcc
Есть ли в любом случае, я могу улучшить этот существующий модуль, ИЛИлюбой другой обходной путь для этого?
Программа наблюдателя
#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;
}