linux bufferizza l'input
quindi quando uno fa getchar()
in realta linux aspetta che sia inserita una riga;
io voglio passare alla modalita -icanon
ovvero modalita raw.
cioe' prendere un carattere alla volta:
come fo'?
linux bufferizza l'input
quindi quando uno fa getchar()
in realta linux aspetta che sia inserita una riga;
io voglio passare alla modalita -icanon
ovvero modalita raw.
cioe' prendere un carattere alla volta:
come fo'?
codice:#include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> struct termios old_attr, new_attr; void set_raw() { if( tcgetattr( STDIN_FILENO, &old_attr ) < 0 ) { perror( "tcgetattr" ); exit( EXIT_FAILURE ); } memcpy( &new_attr, &old_attr, sizeof( struct termios ) ); new_attr.c_lflag &= ~ICANON; /* non canonical mode */ if( tcsetattr( STDIN_FILENO, TCSANOW, &new_attr ) < 0 ) { perror( "tcsetattr" ); exit( EXIT_FAILURE ); } } void unset_raw() { if( tcsetattr( STDIN_FILENO, TCSANOW, &old_attr ) < 0 ) { perror( "tcsetattr" ); exit( EXIT_FAILURE ); } } int main( void ) { set_raw(); getchar(); unset_raw(); return EXIT_SUCCESS; }
grazie tante ...
anche se ogni tanto intervieni a sproposito sei utile...
nessun rimorso.
bene, funzia tutto, inoltre sono riuscito a togliere l' echo
da tastiera scrivendo
new_attr.c_lflag &= ~(ICANON|ECHO)
ora mi serve che l'input non diventi bloccante,
cioe' quando faccio una getchar il programma continua con le istruzioni dopo;
if (getchar())istruzione..
istruzioni2
solo se si preme un tasto si fa' istruzione altrimenti
si fa istruzioni2.
Ma tu vuoi che il programma vada avanti e che in qualsiasi altro punto, se viene premuto un tasto, venga eseguita 'istruzione'?
In tal caso non ha molto senso una chiamata non bloccante .. Semmai potresti farla asincrona.
no, voglio che in un ciclo se viene premuto un tasto avvenga un istruzione.
#define true 1
..
while(true){
..
if (getchar()=='l')x++;
..
}
Hm.. allora potresti usare select() con timeout 0.
potresti farmi un esempio di come lo implementeresti tu..Originariamente inviato da r0x
Hm.. allora potresti usare select() con timeout 0.
Grazie-
Non ti so dire cmq se sia la soluzione migliore.codice:fd_set readfds; struct timeval timeout = { 0 }; FD_ZERO( &readfds ); while( 1 ) { if( select( 1, &readfds, 0, 0, &timeout ) < 0 ) { perror( "select: " ); exit( 1 ); } if( FD_ISSET( 0, &readfds ) ) { /* istruzioni su input */ } /* altre istruzioni */ }