Как запросить ввод без необходимости нажатия RET — Прерывание клавиатуры в C, ОС Linux

Я много читал о том, о чем я спрашиваю, но самое близкое, что я нашел, это использование библиотеки 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
$

Спасибо за вашу помощь!!! знак равно


person Throoze    schedule 20.10.2011    source источник
comment
Если программу собираются проверять скриптом, зачем нужна такая интерактивная фича, как uncooked input?   -  person cnicutar    schedule 20.10.2011
comment
ну, программа делает некоторые другие вещи, например сообщает пользователю, были ли файлы изменены или добавлены в папку, плюс есть такие вещи, как ожидаемые, которые могут взаимодействовать с программами cli; хотя, честно говоря, я думаю, что две задачи (проверка удаленных каталогов и ожидание ввода пользователя) будут проверяться отдельно. В любом случае, возможно, вы правы, и они вообще не используют скрипт... но я бы предпочел не рисковать... хе-хе-хе   -  person Throoze    schedule 20.10.2011


Ответы (1)


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

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

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

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

person Aaron Digulla    schedule 20.10.2011
comment
Кажется, это то, что мне нужно!, еще не пробовал. Сначала у меня есть пара вопросов. Это то, что вы предлагаете сценарий оболочки? Могу ли я встроить сценарии оболочки в код C? Я не эксперт в c, но я знаю, что многие команды unix имеют аналог в виде функций c... есть ли какие-нибудь для stty? если да, то какие библиотеки мне нужно включить? я хотел бы использовать чистый код C... спасибо! - person Throoze; 20.10.2011
comment
Извините за мое невежество! хе-хе-хе, что делает trap? у него нет справочной страницы! а где искать не знаю=/... - person Throoze; 20.10.2011
comment
Я уже нашел, как поместить этот код сценария оболочки в мой код c. Использование функции system(). Я написал следующую функцию: char getChar(){system("stty -echo raw");char input = getchar();system("stty sane");return input;}, и работает отлично!!! большое спасибо!!! знак равно - person Throoze; 20.10.2011
comment
trap — это встроенная команда оболочки. Попробуйте help trap или man bash. - person Aaron Digulla; 21.10.2011