TERMINALE TEKSTOWE I ICH PLIKI SPECJALNE

W systemach uniksowych urządzenia zewnętrzne (fizyczne i abstrakcyjne) mają swoje odpowiedniki w systemie plików jako tak zwane pliki specjalne. Standardowo pliki specjalne urządzeń umieszczone sa w katalogu /dev (device - urządzenie). W szczególności terminale tekstowe użytkowników mają odpowiadające im pliki. W przypadku łączności przez sieć komputerową przy użyciu odpowiednich programów do otwierania tekstowej sesji pracy mówimy o pseudoterminalach. Pliki pseudoterminali umieszczone są w katalogu /dev/pts (pseudoterminals), a ich nazwy są kolejnymi liczbami naturalnymi (0, 1, 2, ...)

ZADANIA:


1. Przeczytać opis i zapoznać się z działaniem polecenia who (w szczególności whoami) oraz polecenia tty. Znaleźć w systemie plików plik specjalny swojego terminala oraz terminali innych studentów. Sprawdzić ich typ i prawa dostępu do nich (polecenie ls - l). Otworzyć drugi terminal, sprawdzić ponownie.

2. Sprawdzić możliwość pisania bezpośrednio do swojego pliku terminala przekierowując do niego wyjście standardowe: a) polecenia echo; b) polecenia cat. Wypróbować możliwość przekierowania wyjścia polecenia podanego w pierwszym terminalu do drugiego ze swoich otwartych terminali.

3. Przydzielić swojemu terminalowi odpowiednie prawa dostępu i wypróbować (w zespołach 2- lub 3-osobowych) możliwość dwustronnej komunikacji pomiędzy użytkownikami w analogiczny sposób.

4. Stosując polecenie tee wypróbować możliwość pisania do kilku terminali jednocześnie.

5. Wypróbować przekierowania: a) cat > /dev/pts/drugi_terminal (uwaga: ctrl-d nie zakończy działania - potrzebne będzie ctrl-c); b) błędne_polecenie 2> /dev/pts/drugi_terminal .

6. Przeczytać opisy i wypróbować możliwość komunikacji pomiędzy użytkownikami przy użyciu polecenia write oraz możliwość zablokowania jej przy użyciu polecenia mesg. Zaobserwować wpływ polecenia mesg na prawa dostępu do pliku terminala.

Plik specjalny /dev/null pełni rolę "wzorca pliku pustego". Może służyć zarówno do tworzenia innych plików pustych, jak i do pochłaniania niepotrzebnych strumieni tekstowych ("niszczarka dokumentów").

7. Znaleźć w systemie plików plik specjalny /dev/null . Przy użyciu polecenia ls -l sprawdzić jego typ i prawa dostępu. Przy użyciu polecenia o postaci cp /dev/null nowy_plik utworzyć w swoim katalogu domowym nowy plik, sprawdzić, że powstał, i że jest pusty. Przy użyciu polecenia o postaci echo jakis_komunikat > /dev/null zapisać do pliku specjalnego dowolny tekst, a następnie sprawdzić (przy użyciu polecenia ls -l), że rozmiar pliku /dev/null nie uległ zmianie.

Charakterystyki techniczne obecnych terminali tekstowych są zaskakująco skomplikowane. Poza najbardziej podstawową funkcją wprowadzania ciągów znaków ASCII z klawiatury i sekwencyjnego (w kolejnych wierszach) wyprowadzania na ekran, terminale zazwyczaj dysponują takimi możliwościami, jak swobodne przemieszczanie kursora po ekranie, korekta/re-edycja wprowadzonego tekstu, włączanie i wyłączanie echowania znaków wprowadzanych z klawiatury, czy zmiana koloru i innych atrybutów czcionki i tła. Użytkownik ma możliwość zmiany charakterystyki swojego terminala, jeśli dysponuje odpowiednią wiedzą techniczną (lub programem, który sam to robi). Dane na temat aktualnych ustawień terminala zapisywane są w bazie danych terminfo (w starszych wersjach - termcap).

8. Przeczytać opis polecenia stty (odczytującego i zmieniającego ustawienia terminala). Odczytać: stty -a . Zmienić ustawienia, np. stty -echo (wypróbować też inne). Przywrócić pierwotne ustawienia: stty sane . Uwaga: po zmianie ustawień może być potrzebne naciskanie ctrl-j zamiast Enter.

9. Zajrzeć do opisu bazy danych terminala (polecenie man terminfo), ocenić jego stopień komplikacji. Wypróbować możliwości dynamicznej zmiany atrybutów wyprowadzanych znaków przy użyciu sekwencji sterujących:
echo $'\e[0;1m'
echo $'\e[0;4m'
echo $'\e[01;35m'
echo $'\e[01;36m'
Sprawdzić skutki przekierowania takich sekwencji do pliku cudzego terminala (za zgodą właściciela).

10.Przejrzeć opis pakietu ncurses (man ncurses) udostępniającego interfejs programisty w języku C do zaawansowanych własności terminala tekstowego. Wypróbować działanie poniższego skrypt w Python'ie:
import curses as c

s = c.initscr()
c.start_color()
c.init_pair(1, c.COLOR_RED, c.COLOR_GREEN)
s.addstr(10, 40, "Ala ma kota", c.color_pair(1))
s.refresh()
s.getkey()
c.endwin()

Spróbować wykonać samodzielnie kilka modyfikacji powyższego skryptu. Sprawdzić skutki przekierowania wyjścia programu do pliku cudzego terminala (za zgodą właściciela)