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. 7Znaleźć 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. 10Przejrzeć 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