Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

w

Ć iczenie ó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