0

我想监视一个在一个终端窗口上运行的交互式 C 程序(比如 program1)。并将输入作为数字(0-9)

正如我所期望的监控:当我向program1(在单独的终端上运行)提供输入时,我的观察者应该检测到按键被按下(从单独的终端)。

为此,我必须编写一个 C 程序 (observer_prog.c),它将在单独的终端上执行,等待来自 program1 的活动。

我为 GCC 编译器 kbhit() 函数实现了以下链接中的建议。但它无法检测到来自不同终端执行的击键。

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;
  }
4

1 回答 1

-1

嗨,我不确定,但您可以尝试将 STDIN 更改为 /dev/ttyUSB*(或适用的设备节点。),因为我们正在从 USART 读取它。让我们知道它是否有效。

于 2018-05-21T12:53:14.487 回答