Do spisu tresci tematu 7

Podprogram obslugi terminali





Spis tresci


Wprowadzenie

Urzadzenia terminalowe (dalej bedziemy je nazywac terminalami) sa szczegolnym przypadkiem urzadzen znakowych, przeznaczonymi do "kontaktu" systemu z ludzmi. Ich osobliwosc polega glownie na tym, ze jako urzadzenia przeznaczone do komunikacji z czlowiekiem maja nieco zmieniana semantyke funkcji systemowej read. Dlaczego ? Otoz jesli wywolujemy read(..) z zadaniem wczytania pewnej ilosci bajtow, to oczekujemy ze jej wykonanie zakonczy sie dopiero wtedy gdy te bajty zostana wczytane lub zostanie osiagniety koniec pliku (To jest nie do konca prawdza w przypadku laczy i temu podobnych). W przypadku terminali takie podejscie jest nieprzydatne, gdyz ludzie, gdy np.wprowadzaja polecenia, to oczekuja reakcji programu po nacisnieciu klawisza ENTER, a nie gdy wprowadza np. 10 (lub 100) znakow. Oczywiscie ktos moglby powiedziec, ze program moglby za kazdym razem zadac odczytu tylko jednego bajtu i nastepnie sobie skladac cale polecenie po kolei. To podejscie jednak ma powazne wady: Jeszcze jednym powodem specjalnego znaczenia terminali jest pojecie sesji. Po prostu gdy uzytkownik zasiadzie przy klawiaturze, wejdzie do systemu i, za pomoca polecen systemowych zacznie tworzyc procesy, to beda one (powinny byc) w pewien sposob zwiazane z tym urzadzeniem, po to, aby w momencie zakonczenia pracy mogly zostac powiadomione o tym fakcie(a nawet zakonczone.)

Terminale: pojecia,struktury,algorytmy itp.


Dyscyplina linii

Przez dyscypline linii rozumiemy wstepne przetwarzanie znakow wejsciowych (czasmi tez wyjsciowych) na drodze terminal -> proces. Jest wprowadzone dlatego, zeby miec pewien standardowy sposob obslugi pewnych kombinacji klawiszy, np. Ctl-Z lub Ctl-C, aby mozna bylo systemowi zlecic takie rzeczy jak wyswietlanie (lub nie) echa wprowadzonych znakow itp. Mozna sie oczywiscie sprzeczac czy taki fragment kodu powinien byc w jadrze systemu operacyjnego, ale zwykle rzadko kiedy chcemy (chcielismy ?) czytac surowe wejscie-wyjscie, a implementacja takiej obrobki znakow w programach bylaby zapewne tylko dublowaniem kodu.

Interfejs do dyscypliny linii jest zdefiniowany w /include/linux/tty_ldisc.h. Tu mozna jedynie dodac ze w Linux'ie sa zdefiniowane nastepujace dyscypliny linii:

Trzy ostatnie dyscypliny linii, to w rzeczywistosci implementacje protokolow sieciowch, natomiast N_MOUSE jestu uzywana na komputerach SUN ale nie wglebialem sie co ona wlasciwie robi. Teraz omowie najwazniesza (chyba) dyscypline nazywajaca sie N_TTY. Jest to ta dyscyplina ktorej efekty widza wszyscy pracujacy pod Linux'em; to ona wysyla SIGINT po nacisnieciu Ctl-C albo SIGSTP po nacisnieciu Ctl-Z,dzieki niej mamy na ekranie echo naciskanych klawiszy.A oto jej 2 algorytmy algorytmy:(W nawiasie nazwa w interfejsie)

Interfejs sterownika

Jak powiedzialem wczesniej, w systemie moga byc rozne rodzaje urzadzen terminalowych. Tym, co je rozni jest wlasnie to jaki maja sterownik, tzn. modul dokonujacego koncowego "wyrzucenia" znakow i jednoczesnie odczytujacego znaczki z zewnatrzi i za pomoca ldisc->receive_buf() przekazujacym je do dyscypliny linii. Obecnie w Linux'ie jest zdefiniowane 5 rodzajow sterownikow:

Jednak w systemie sa uzywane tylko 3 z nich tzn. sterowniki:konsoli, pseudoterminali i lacza szeregowego. (Choc zapewne pozostale tez daloby sie skonfigurowac.) Dokladna postac interfejsu sterownika urzadzen jest podana w /include/linux/tty_driver.h. Tu opowiem tylko o 2 funkcjach, ktore moga sie wydac nieoczywiste: throttle(...) i unthrottle(...) Jak napisalem wczesniej, przy opisie struktury dyscypliny linii sterownik, po odebraniu znakow ze swiata zewnetrznego, wywoluje funkcje dyscypliny linii receive_buf(...). Wtedy dyscyplina linii, analizujac to, co otrzymala, moze dojsc do wniosku, ze nalezaloby przyhamowac nieco sterownik i w tym celu wywoluje funkcje driver->throttle(..). Natomiast gdy sytuacja wroci do bezpiecznego stanu,dyscyplina linii moze poinformowac o tym sterownik wywolujac funkcje driver->unthrottle()

Dodatki


Z jakich plikow korzystalem:

Ograniczenia:

Ciekawe rozwiazania programistyczne: Mi osobiscie najbardziej podobala obrobka klawiszy za pomoca tablicy odwzorowan. (Patrz nastepny plik).Prawde mowiac jest to jedyny powod dla ktorego napisalem cos o konsoli.
Najwazniejsze struktury zostaly opisane wyzej (wraz z linkami do plikow)



Autor Kamil Jonca