Instrukcja do laboratorium Systemów Operacyjnych
(semestr drugi)
wiczenie ósme
Ć
Temat: Niskopoziomowa obs uga terminali
ł
Opracowanie:
mgr in . Arkadiusz Chrobot
ż
Wprowadzenie
1. Terminale
Ka dy
ż
system komputerowy jest wyposa ony
ż
w pewną liczbę urz dze
ą
ń
przeznaczonych do komunikacji z u ytkownikiem
ż
lub innymi komputerami.
Mianem „terminal” okre la
ś
się najcz
ciej
ęś
monitor i klawiatur ,
ę choć mo na
ż
tym terminem okre li
ś ć również takie urz dzenia
ą
jak modem i drukarka.
W przypadku systemów uniksowych okre la
ś
się tak również protokół terminala
wyznaczaj cy
ą
sposób obs ugi
ł
danego urz dzenia
ą
przez system operacyjny
i część systemu obs uguj c
ł
ą ą urz dzenia
ą
do interakcji z u ytkownikiem.
ż
Istnieje
zbiór funkcji wchodz cych
ą
w sk ad
ł
API, które umo liwiaj
ż
ą programom
u ytkownika
ż
sterowanie zachowaniem terminali. Z ka dym
ż
terminalem są
zwi zane
ą
dwie kolejki, wej ciowa
ś
i wyj ciowa,
ś
które stanowią rodzaj buforów
j dra
ą
na znaki, które mają zostać zapisane na ekran, b d
ą ź które zosta y
ł
pobrane z klawiatury. Ka dy
ż
terminal mo e
ż
pracować w dwóch trybach:
kanonicznym i niekanonicznym. W pierwszym trybie znaki przeczytane lub
zapisywane na terminal są przetwarzane grupami, które ko cz
ń
ą znaki nowej
linii, ko ca
ń
linii, lub ko ca
ń
pliku. Ponadto niektóre znaki mają specjalne
znaczenie, np.: mogą powodować skasowanie poprzedzaj cego
ą
je znaku.
W trybie niekanonicznym program mo e
ż okre li
ś ć samodzielnie jakimi porcjami
mają być czytane i pisane dane na terminal, oraz które znaki b d
ę ą znakami
kontrolnymi.
2. Wybrane funkcje i struktury danych
Podstawową strukturą danych wykorzystywaną w obs udze
ł
terminali jest
struktura termios. Standardy uniksowe gwarantuj ,
ą
e
ż
b d
ę ą się w niej
znajdowa przynajmniej nast puj ce pola:
ć
ę
ą
c_iflag – pole okre laj ce flagi trybu wej cia,
ś
ą
ś
c_oflag – pole okre laj ce flagi trybu wyj cia,
ś
ą
ś
c_cflag – pole okre laj ce flagi trybu sterowania,
ś
ą
c_lflag – pole okre laj ce flagi trybu lokalnego,
ś
ą
cc_t c_cc[NCCS] – tablica okre laj ca,
ś
ą
które znaki są zwi zane
ą
z funkcjami
kontrolnymi.
Uwaga:
Niektóre terminale mogą definiować w asne
ł
pola w tej strukturze, zwi zane
ą
np.
z
obs ug
ł
ą
kolorowych
wy wietlaczy,
ś
dlatego
przy
manipulacji
ustawieniami
terminala
nale y
ż
przeczytać
jego
bie
ce
żą
ustawienia,
zapami ta
ę ć je w osobnej zmiennej, a nast pnie
ę
zmodyfikować odpowiednie
pole struktury termios przy pomocy odpowiednich sta ych
ł
i operatorów
2
bitowych, a nast pnie
ę
wywo a
ł ć funkcję zmieniaj c
ą ą zachowanie terminala.
Przed
zako czeniem
ń
program
powinien
przywrócić
domy ln
ś ą
obs ug
ł
ę
terminala.
funkcja isatty() – sprawdza, czy podany deskryptor pliku odnosi się do
pliku urz dzenia terminala.
ą
funkcja ttyname() – zwraca nazwę pliku terminala do której odnosi się
deskryptor.
funkcja tcgetattr() – pobiera bie
ce
żą
atrybuty terminala zwi zanego
ą
z podanym deskryptorem pliku i zapisuje je do struktury termios.
funkcja tcsetattr() – ustawia
dane
żą
atrybuty terminala zwi zanego
ą
z podanym deskryptorem pliku. Nale y
ż zauwa y ,
ż ć
e
ż stan tych atrybutów
nie zmieni się po zako czeniu
ń
program i je li
ś
nie przywrócimy domy lnej
ś
procedury obs ugi
ł
terminala mo emy
ż
zak óci
ł
ć pracę innych programów
wspó pracuj cych z tym samym terminalem.
ł
ą
makro VMIN – ma znaczenie tylko w trybie niekanonicznym, okre la
ś
miejsce w tablicy cc okre laj ce
ś
ą
liczbę bajtów, która musi się znaleźć
w kolejce wej ciowej zanim zostanie zako czona operacja odczytu.
ś
ń
makro VTIME – ma znaczenie tylko w trybie niekanonicznym, okre la
ś
miejsce w tablicy cc, okre laj ce
ś
ą
jak d ugo
ł
b dzie
ę
czekał system zanim
zako czy operacje wej cia. Jednostk czasu jest 0,1 sekundy.
ń
ś
ą
Szczegó owy
ł
opis wszystkich funkcji i struktur danych zwi zanych
ą
z obs ug
ł
ą
terminali
znajduje
się
w
podr czniku
ę
systemowym
(man
termios)
i w dokumentacji biblioteki glibc: „The GNU C Library Reference Manual”
autorstwa Sandry Loosemore, Richarda Stallmana, Rolanda McGratha,
Andrew Orama i Urlicha Dreppera.
Zadania
1. Napisz program, który sprawdzi, czy z deskryptorem standardowego wej cia
ś
(STDIN_FILENO lub wartość 0) jest zwi zany
ą
terminal. Je li
ś
tak, to program
powinien wypisać nazwę pliku urz dzenia
ą
tego terminala, oraz kilka jego
bie
cych ustawie .
żą
ń
2. Napisz program, który wy czy
łą
echo, czyli wypisywanie znaków wprowadzonych
z klawiatury na ekran. Po ponownym uruchomieniu program powinien
3
przywróci echo.
ć
3. Napisz program demonstruj cy
ą
obs ug
ł
ę terminala w trybie niekanonicznym
(Mo e
ż
to być np. program posiadaj cy
ą
menu, które jest uaktywnione
naci ni ciem klawisza, bez konieczno ci potwierdzania klawiszem Enter).
ś ę
ś
4. Napisz program, po którego uruchomieniu terminal b dzie
ę
wypisywał wszystkie
informacje du ymi
ż
literami (niezale nie
ż
od ustawienia CapsLock). Efekt ten
powinno usuwa ponowne uruchomienie programu.
ć
4