Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)
w
Ć iczenie ósme
Temat: Niskopoziomowa obsługa terminali Opracowanie:
mgr inż. Arkadiusz Chrobot
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
ć
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