Como pedir entrada sem a necessidade de pressionar RET - Interrupção de teclado em C, Linux OS

StackOverflow https://stackoverflow.com/questions/7832996

Pergunta

Eu li muito sobre o que estou perguntando, mas a coisa mais próxima que encontrei é usando a biblioteca ncurses. O que estou fazendo é um cliente http simples que monitora algumas pastas remotas para verificar se seus arquivos foram alterados ou se há novos arquivos. Além disso, ele deve verificar o stdin para alguns comandos, portanto, estou planejando usar o processo pai para monitorar o stdin e o processo de trabalho para monitorar os diretórios remotos. Eu gostaria de usar algo como interrupção do teclado. Algo como instalar um manipulador de sinais para pressionar o teclado, para que o usuário não precise pressionar enter após cada comando.

Até agora, ncurses faz o que eu preciso, mas não consigo imprimir coisas em stdout, mas sim em stdscr. O problema com isso é que este projeto é uma tarefa para a faculdade e é muito provável que seja verificado por meio de um script que leia o stdout do programa mi ...

Então, alguma sugestão?

o código relevante é:

#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        */

quando executo meu programa, se redireciono a saída para um arquivo, obtenho um arquivo vazio

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

Obrigado pela ajuda !!!=)

Foi útil?

Solução

Isso foi surpreendentemente difícil de encontrar e ainda não estou feliz com o resultado: você pode usar stty() para entrar no modo bruto.Isso evita (n) maldições e qualquer violação do stdout.

Em um script de shell, você usaria stty raw ( explicação mais longa ).

Esta resposta contém o código C: Capture caracteres da entrada padrão sem esperar que enter seja pressionado

Não se esqueça de restaurar as configurações do TTY antes de sair ou seu terminal terá um comportamento estranho.Sugiro envolver seu código em um script de shell que contenha trap "stty sane" EXIT próximo ao início.Isso sempre executará stty sane quando o script terminar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top