next up previous
Next: ioctl Up: Introducere Unix. Operatii I/O. Previous: Exemple

Controlul terminalului

In cele ce urmeaza vom descrie o serie de functii si structuri specifice dispozitivelor terminale. Terminalul este un dispozitiv, de obicei echipat cu tastatura si monitor, care permite interactiunea utilizatorului cu sistemul.

In Linux exista doua moduri de intrare pentru un terminal:

In mod obisnuit, programele utilizeaza modul canonic, deoarece permite utilizatorului prelucrarea intrarii linie cu linie. Situatiile pentru care se foloseste modul necanonic apar atunci cand un program primeste comenzi formate dintr-un singur caracter (de exemplu less) sau are facilitati de editare proprii.

Toate informatiile referitoare la un dispozitiv terminal sunt stocate intr-o structura denumita struct termios. Aceasta are forma urmatoare

struct termios {
        ...
        tcflag_t c_iflag;    /* input modes */
        tcflag_t c_oflag;    /* output modes */
        tcflag_t c_cflag;    /* control modes */
        tcflag_t c_lflag;    /* local modes */
        cc_t c_cc[NCSS];     /* control chars */
}

Structura poate avea si alte campuri in afara celor prezentate, dar cele de aici sunt obligatorii. Tipul tcflag_t este o masca de biti. Fiecare bit controleaza o anumita caracteristica. Tipul cc_t este folosit pentru a reprezenta valorile unor caractere care indeplinesc diverse functionalitati in cadrul terminalului. Elementul c_cc[VMIN] reprezinta directiva MIN iar elementul c_cc[VTIME] reprezinta directiva TIME. Macro-ul NCCS reprezinta numarul de elemente din vectorul c_cc.

Ne intereseaza numai componenta c_lflag din cadrul celor patru campuri de tip tcflag_t pentru ca aceasta controleaza modurile (vom dori sa lucram in mod noncanonic).

Directivele MIN si TIME (deci elementele c_cc[VMIN] si c_cc[VTIME]) sunt folosite pentru a determina comportamentul unui apel read in mod necanonic. Directiva MIN precizeaza numarul minim de octeti care trebuie sa existe la intrare pentru ca un apel read sa se intoarca. Directiva TIME precizeaza cat timp trebuie sa se astepte primirea numarului de octeti cerut pana la intoarcerea apelului read, in zecimi de secunda (0.1 secunde). In functie de valorile acestor primitive se disting urmatoarele cazuri:

  1. atat TIME cat si MIN sunt valori nenule; in acest caz TIME specifica cat timp trebuie sa se astepte dupa fiecare caracter citit pentru a vedea daca mai sosesc altele; dupa primul caracter citit, un apel read asteapta fie pana cand au sosit MIN caractere, fie pana cand TIME expira in asteptarea unui caracter;
  2. atat TIME cat si MIN sunt nule; in acest caz read se intoarce imediat si citeste cate caractere erau la acel moment dat disponibile la intrare; lipsa de caractere la intrare inseamna o valoare de retur 0 a lui read;
  3. TIME este nenul, iar MIN este 0; in acest caz, read asteapta timp de TIME * 0.1 secunde aparitia unui caracter la intrare; cand se intoarce, returneaza numarul de octeti care au devenit disponibili, pana la numarul maxim precizat in apel, sau 0 daca timer-ul a expirat fara aparitia vreunui caracter;
  4. TIME este 0, iar MIN este nenul; in acest caz, read asteapta (nedefinit), pana cand cel putin MIN octeti sunt disponibili la intrare; in acel moment read intoarce numarul de octeti disponibili, care nu poate depasi numarul maxim precizat in apel; un apel read poate intoarce mai mult de MIN octeti, daca exista mai mult de MIN octeti disponibili in momentul apelului.
Exista doua modalitati de interactiune cu un terminal, prin intermediul structurii struct termios: folosind apelul ioctl sau folosind apeluri POSIX.



Subsections
next up previous
Next: ioctl Up: Introducere Unix. Operatii I/O. Previous: Exemple
Razvan Adrian Deaconescu 2005-10-01