如何在C,Linux OS中无需按RET键盘中断请求输入

时间:2011-10-20 08:20:03

标签: c interrupt ncurses keyboardinterrupt

我已经阅读了很多关于我要求的内容,但我发现最接近的是使用ncurses库。我正在做的是一个简单的http客户端,它将监视一些远程文件夹以检查其文件是否已更改或是否有新文件。此外,它必须检查stdin的某些命令,所以,我打算使用父进程来监视stdin和worker进程来监视远程目录。我想用键盘中断之类的东西。类似于在键盘按下时安装信号处理程序,因此用户无需在每个命令后按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
$

感谢您的帮助! =)

1 个答案:

答案 0 :(得分:1)

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

从shell脚本中,您可以使用stty rawlonger explanation)。

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

在退出之前不要忘记恢复TTY的设置,否则终端会出现奇怪的现象。我建议将代码包装到一个shell脚本中,该脚本在开头附近包含trap "stty sane" EXIT。当脚本终止时,这将始终执行stty sane