Как запросить ввод без необходимости нажатия RET - Прерывание клавиатуры в C, ОС Linux - PullRequest
0 голосов
/ 20 октября 2011

Я много читал о том, что я спрашиваю, но самое близкое, что я нашел, это использование библиотеки ncurses. Что я делаю, так это простой http-клиент, который будет контролировать некоторые удаленные папки, чтобы проверить, изменились ли его файлы или есть новые файлы. Кроме того, он должен проверить стандартный ввод для некоторых команд, поэтому я планирую использовать родительский процесс для мониторинга стандартного ввода и рабочий процесс для мониторинга удаленных каталогов. Я хотел бы использовать что-то вроде прерывания клавиатуры. Что-то вроде установки обработчика сигнала на нажатие клавиатуры, поэтому пользователю не нужно нажимать клавишу ввода после каждой команды.

Пока что 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 Ответ

1 голос
/ 20 октября 2011

Это было удивительно трудно найти, и я все еще не доволен результатом: вы можете использовать stty(), чтобы перейти в сырой режим.Это позволяет избежать (n) проклятий и любого вмешательства в stdout.

. Из сценария оболочки вы можете использовать stty raw ( более длинное объяснение ).

ответ содержит код C: Захват символов со стандартного ввода без ожидания нажатия клавиши ввода

Не забудьте восстановить настройки TTY перед выходом, иначе ваш терминал будет вести себя странно.Я предлагаю обернуть ваш код в сценарий оболочки, который содержит trap "stty sane" EXIT в начале.Это всегда будет выполняться stty sane, когда скрипт завершится.

...