Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)
w
Ć iczenie dziewiąte
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
okre laj
ś
cy
ą
sposób obsługi danego urządzenia przez system operacyjny i część systemu obsługuj c
ą ą urządzenia 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 bitowych, a nast pnie
ę
wywołać funkcję zmieniaj c
ą ą zachowanie terminala.
2
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 kanonicznym, 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 przywróci echo.
ć
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