next up previous
Next: stty Up: Controlul terminalului Previous: ioctl

Apeluri POSIX

Informatii despre apelurile POSIX pentru controlul terminalului pot fi obtinute prin consultarea paginii de manual ($ man 3 termios). Ne vor interesa functiile tcgetattr (echivalent cu un apel ioctl care primeste TCGETS ca al doilea parametru) si tcsetattr (echivalent cu TCSETS). Sintaxele de apel pentru cele doua functii sunt

#include <termios.h>
#include <unistd.h>

int tcgetattr (int fd, struct termios *termios_p);
int tcsetattr (int fd, int optional_actions, constr struct termios
               termios_p);

fd este descriptorul de fisier pentru terminalul utilizat (in cazul lucrului pe intrarea standard acesta va fi 0 sau STDIN_FILENO);

termios_p este structura termios utilizata pentru memorarea informatiilor despre terminal;

optional_actions (numai la tcsetattr) specifica momentul in care se vor actualiza parametrii de functionare ai terminalului; poate avea valorile TCSANOW, TCSADRAIN, TCSAFLUSH (de regula se va folosi TCSANOW).

Desi aceste functii permit o interactiune mai facila si intuitiva cu terminalul, exista unele terminale pentru care functionarea corecta este dependenta de folosirea unor apeluri ioctl.

Exemplul prezentat la ioctl transcris in apeluri POSIX (numai functiile start_getch si stop_getch) este:

/*
 * actualizare terminal pentru lucrul in modul necanonic fara ecou
 */

void start_getch (void)
{
        /* retinem in old_termios starea curenta a terminalului */
        if (tcgetattr (STDIN_FILENO, &old_termios) < 0) {
                perror ("tcgetattr");
                exit (EXIT_FAILURE);
        }

        /* copiem in new_termios starea terminalului pentru actualizare */
        memcpy (&new_termios, &old_termios, sizeof (struct termios));

        /* stabilire mod necanonic fara ecou */
        make_raw (&new_termios);

        /* actualizare terminal cu noile caracteristici */
        if (tcsetattr (STDIN_FILENO, TCSANOW, &new_termios) < 0) {
                perror ("tcsetattr");
                exit (EXIT_FAILURE);
        }
}

/*
 * revenire la modul de lucru initial
 */

void stop_getch (void)
{
        /* readucem terminalul in starea descrisa de old_termios */
        if (tcsetattr (STDIN_FILENO, TCSANOW, &old_termios) < 0) {
                perror ("tcsetattr");
                exit (EXIT_FAILURE);
        }
}



Razvan Adrian Deaconescu 2005-10-01