Next: ioctl
Up: Introducere Unix. Operatii I/O.
Previous: Exemple
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:
- modul canonic - in acest mod, ceea ce se primeste la intrare
se formateaza in linii (incheiate cu newline, EOF sau EOL); acest
lucru inseamna ca nu se poate citi nimic pana cand nu se introduce
un caracter de incheiere; drept consecinta, un apel read se va intoarce
dupa citirea unei linii, indiferent cate caractere s-au cerut sa fie
citite;
- modul noncanonic - in acest mod caracterele nu sunt grupate
in linii; numarul de octeti care vor fi cititi vor depinde de primitivele
MIN si TIME (care vor fi descrise mai jos).
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:
- 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;
- 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;
- 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;
- 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: ioctl
Up: Introducere Unix. Operatii I/O.
Previous: Exemple
Razvan Adrian Deaconescu
2005-10-01