LABORATORIUM 4


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

Zad. 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.
Zad. 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.
Zad. 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.
Zad. 4
Stosując polecenie tee wypróbować możliwość pisania do kilku terminali jednocześnie.
Zad. 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
Zad. 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").

Zad. 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).

Zad. 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.
Zad. 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).
Zad. 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 programu:
#include <stdio.h>
#include <ncurses.h>

main() {
 	initscr();
	start_color();
 	init_pair(1,COLOR_RED,COLOR_GREEN);
 	attrset(COLOR_PAIR(1));
 	move(10,30);
 	printw("%s","Ala ma kota");
 	refresh();
 	getchar();
 	endwin();
 	return;
}
UWAGA: w poleceniu kompilacji należy użyć opcji -lncurses .
Spróbować wykonać samodzielnie kilka modyfikacji powyższego programu. Sprawdzić skutki przekierowania wyjścia programu do pliku cudzego terminala (za zgodą właściciela)
Zad. 11
W pliku snake.py znajduje się kod gry "snake" w Pythonie używający pakiet curses. Po zapoznaniu się z nim dodaj parę fragmentów kodu ulepszających grę, np. kolory lub dodatkowe funkcje, jak pauza po wciśnięciu jakiegoś klawisza.
Przykład podobnej gry, ale napisanej w C: snake.c