Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [c]modo Raw In C In Linux

    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'?

  2. #2
    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;
    }

  3. #3
    grazie tante ...
    anche se ogni tanto intervieni a sproposito sei utile...
    nessun rimorso.

  4. #4
    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.

  5. #5

  6. #6
    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.

  7. #7
    no, voglio che in un ciclo se viene premuto un tasto avvenga un istruzione.
    #define true 1
    ..
    while(true){
    ..
    if (getchar()=='l')x++;
    ..
    }

  8. #8
    Hm.. allora potresti usare select() con timeout 0.

  9. #9
    Originariamente inviato da r0x
    Hm.. allora potresti usare select() con timeout 0.
    potresti farmi un esempio di come lo implementeresti tu..
    Grazie-

  10. #10
    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 */
    }
    Non ti so dire cmq se sia la soluzione migliore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.