Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

w

Ć iczenie dziewiąte

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

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

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 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