Comment demander l'avis sans avoir besoin d'appuyer sur RET - Clavier Interrompre en C, Linux OS

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

Question

J'ai lu beaucoup de choses sur ce qui im ??demander, mais la chose la plus proche que j'ai trouvé est en utilisant la bibliothèque ncurses. Que faire im est un simple client http qui Monitory certains dossiers à distance pour vérifier si ses fichiers ont changé ou si de nouveaux fichiers. En outre, il doit vérifier stdin pour certaines commandes, donc, je prévois sur l'utilisation du processus de père processus monitory stdin et travailleur à Monitory les répertoires distants. Je voudrais utiliser quelque chose comme interruption du clavier. Quelque chose comme l'installation d'un gestionnaire de signal clavier pressurage, afin que l'utilisateur n'a pas à appuyer sur Entrée après chaque commande.

Jusqu'à présent, ncurses fait ce que j'ai besoin, mais je ne peux pas imprimer des choses sur la sortie standard, mais plutôt dans stdscr. Le problème est que ce projet est une mission pour le collège, et il est très susceptible d'être vérifié par un script qui a lu stdout ...

du programme mi

, des suggestions?

le morceau de code correspondant est le suivant:

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

quand je lance mon programme, si je rediriger la sortie vers un fichier, je reçois un fichier vide

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

Merci pour votre aide !!! =)

Était-ce utile?

La solution

Ce fut étonnamment difficile à trouver et je ne suis toujours pas satisfait du résultat: Vous pouvez utiliser stty() pour passer en mode brut. On évite ainsi (n) malédictions et toute altération stdout.

A partir d'un script shell, vous utiliseriez stty raw ( explication plus ).

Cette réponse contient le code C: caractères de capture de l'entrée standard sans attendre entrer à presser

Ne pas oublier de restaurer avant de quitter ou de votre terminal comportent impair paramètres de l'ATS. Je suggère d'envelopper votre code dans un script shell qui contient trap "stty sane" EXIT près du début. Ce sera toujours exécuter stty sane lorsque le script se termine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top