[Lugge] Re: Equivalente del getchar Unix

  • From: ianezz@xxxxxxxxxx
  • To: lugge@xxxxxxxxxxxxx
  • Date: Mon, 8 Jul 2002 15:42:47 +0200

Ettore Geminiani, pigiando tasti a caso sul citofono, ha scritto:


 > Stò cercando di effettuare la compilazione del mio programma da
 > Unix SCO a Linux. Nonostante gli apprezzabili risultati
 > ricompilando il codice c ( ansi ), senza alcuna modifica per linux,
 > mi trovo un pò in "palla" nel trovare un equivante del comando
 > getchar.

Devi mettere il terminale in modalita` raw se vuoi che il kernel passi
i caratteri digitati subito invece che attendere che venga premuto
invio.

Vedi l'esempio che trovi nella Serial-Programming-HOWTO riguardo al
Non-Canonical Input Processing:

http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html

in pratica credo si tratti di

1) Salvarsi in una struct termios il vecchio stato del terminale con

   struct termios old_termios, new_termios;
   tcgetattr(1, &old_termios);

2) Crearsene una nuova uguale, ma con le impostazioni opportune

   memcpy(&new_termios,&old_termios,sizeof(struct termios));
   new_termios.c_lflag = 0;
   new_termios.c_cc[VMIN] = 0;
   new_termios.c_cc[VTIME] = 30; /* Aspetta al massimo 3 secondi */
   
3) Impostarlo

   tcsetattr(1,TCSAFLUSH,&new_termios);

   /* Da qui in poi una getchar() dovrebbe ritornare subito, o al
   massimo in 3 secondi.... */


4) Leggere il carattere (aspettando al max 3 secondi)

   z = getchar(); 

   if(z < 0) 
   { 
       /* Nessun carattere digitato entro il timeout */
       ...
   }

5) Ripristinare il vecchio termios

   tcsetattr(1,TCSAFLUSH,&old_termios);
   
   
Ecco un programmino di prova fatto su HP-UX (ma dovrebbe funzionare
identico anche su Linux, che al momento non ho sottomano):

----------------------------------------------------------------------

#include <termios.h>
#include <stdio.h>
#include <string.h>

int
main()
{
    struct termios old_tio, new_tio;
    int c;

    tcgetattr(1,&old_tio);

    memcpy(&new_tio,&old_tio,sizeof(struct termios));

    new_tio.c_lflag = 0;
    new_tio.c_cc[VMIN] = 0;
    new_tio.c_cc[VTIME] = 30;

    tcsetattr(1,TCSAFLUSH,&new_tio);

    c = getchar();

    tcsetattr(1,TCSAFLUSH,&old_tio);

    printf("Received character %d\n",c);

    return 0;
}



-- 
 |   \    \  | ___|_  |_  | ianezz AT sodalia.it
 |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
_|_/  _\_|  _|____|___|___| http://www.linuxtrent.it
<========----------
 Prima di scrivere in m-list per favore leggi il regolamento
 http://www.lugge.net/soci/manifesto.htm#list

 Archivio delle e-mail postate in lista
 http://www.freelists.org/archives/lugge/

----------========>
 Incontri in sede: martedì 15:00-18:00 e sabato 9:30-12.30
 

Other related posts: