我已经阅读了很多有关即时通讯的内容,但是最近发现的是使用ncurses库。我正在做的是一个简单的http客户端,它将监视一些远程文件夹,以检查其文件是否已更改或是否有新文件。另外,它还必须检查stdin中的某些命令,因此,我计划使用父进程监视stdin,使用工作进程监视远程目录。我想使用键盘中断之类的东西。诸如在键盘按下时安装信号处理程序之类的东西,因此用户不必在每个命令之后按下Enter键。

到目前为止,ncurses可以满足我的需求,但是我无法在stdout上打印内容,而是在stdscr中打印。问题在于该项目是大学的作业,很可能通过读取mi程序标准输出的脚本进行检查...

那么,有什么建议吗?

相关的代码段是:

#include <ncurses.h>

  initscr();        /* Start curses mode              */
  raw();            /* Line buffering disabled        */
  noecho();         /* Don't echo() while we do getch */
  char key;
  while (TRUE) {
    key = getch();
    switch(key)
      {
      case 's':
        printw("Instrucción recibida: STOP\n");
        printf("Hasta Luego!\n");
        fflush(stdout);
        /*NOTICE THIS HAS NO EFFECT, */
        refresh();
        sleep(2);
        endwin();           /* End curses mode        */
        fflush(stdout);
        exit(0);
        break;
      case 'c':
        printw("Instrucción recibida: CONTINUE\n");
        refresh();
        break;
      case 'p':
        printw("Instrucción recibida: PAUSE\n");
        refresh();
        break;
      default:
        printw("Instrucción desconocida recibida: %c\n",key);
        refresh();
      }
  }
  endwin();           /* End curses mode        */


当我运行程序时,如果我将输出重定向到文件,则会得到一个空文件

$ verific -d http://url.toMy.directory/ > output
$ cat output
$


谢谢你的帮助!!! =)

最佳答案

这很难找到,我对结果仍然不满意:您可以使用stty()进入原始模式。这样可以避免(n)次诅咒和对stdout的任何篡改。

在shell脚本中,您将使用stty rawlonger explanation)。

此答案包含C代码:Capture characters from standard input without waiting for enter to be pressed

退出前,请不要忘记恢复TTY的设置,否则您的终端会出现异常。我建议将您的代码包装到一个外壳脚本中,该脚本在开头附近包含trap "stty sane" EXIT。脚本终止时,它将始终执行stty sane

关于c - 如何在不按RET的情况下请求输入-C,Linux OS中的键盘中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7832996/

10-13 01:23