Наблюдение за активностями запуска программы из другой программы на Си.[Отчет о ключевых ударах] - PullRequest
0 голосов
/ 21 мая 2018

Я хочу отслеживать интерактивную программу на 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;
  }

1 Ответ

0 голосов
/ 21 мая 2018

привет, я не уверен, но вы можете попробовать изменить STDIN на / dev / ttyUSB * (или соответствующий узел устройства), так как мы читаем его из USART.Дайте нам знать, если это работает или нет.

...