Domanda

Ho letto molto su quello che chiedo, ma la cosa più vicina che ho trovato è usare la libreria ncurses. Quello che sto facendo è un semplice client http che monitorerà alcune cartelle remote per verificare se i suoi file sono cambiati o se ci sono nuovi file. Inoltre, deve controllare lo stdin per alcuni comandi, quindi, sto pianificando di utilizzare il processo padre per monitorare lo stdin e il processo di lavoro per monitorare le directory remote. Vorrei usare qualcosa come interruzione della tastiera. Qualcosa come l'installazione di un gestore di segnali alla pressione della tastiera, in modo che l'utente non debba premere Invio dopo ogni comando.

Finora ncurses fa ciò di cui ho bisogno, ma non posso stampare cose su stdout, ma invece in stdscr. Il problema è che questo progetto è un compito per il college, ed è molto probabile che venga controllato tramite uno script che legge lo stdout del programma mi ...

quindi, qualche suggerimento?

la parte di codice pertinente è:

#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 eseguo il mio programma, se reindirizzo l'output a un file, ottengo un file vuoto

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

Grazie per il tuo aiuto !!!=)

È stato utile?

Soluzione

Questo è stato sorprendentemente difficile da trovare e non sono ancora soddisfatto del risultato: puoi usare stty() per entrare in modalità raw.Questo evita (n) maledizioni e qualsiasi manomissione con stdout.

Da uno script di shell, dovresti utilizzare stty raw ( spiegazione più lunga ).

Questa risposta contiene il codice C: Cattura i caratteri dallo standard input senza attendere che venga premuto Invio

Non dimenticare di ripristinare le impostazioni di TTY prima di uscire o il tuo terminale si comporterà in modo strano.Suggerisco di racchiudere il codice in uno script di shell che contiene trap "stty sane" EXIT all'inizio.Questo eseguirà sempre stty sane quando lo script termina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top