I. Narzędzia systemowe i pisanie skryptów
-
Zapoznaj się z programem ps (man ps) uruchamiając go na
próbę z różnymi argumentami, w szczególności z argumentami
opcjonalnymi -u, -t, i -p. Naucz się sprawnie
posługiwać się tym programem, aby niezawodnie sprawdzać istnienie i
parametry wybranych procesów (stan procesu, priorytet, nice, ilość
pamięci, zużycie czasu procesora).
-
Zapoznaj się z programem vmstat (man vmstat)
uruchamiając go na próbę z różnymi argumentami. Następnie napisz
skrypt zwany my_vmstat, służący do bardziej werbalnego
uruchamiania vmstat. Po uruchomieniu skrypt powinien odpytać
użytkownika o potrzebne mu informacje (informacje a nie opcje), i
następnie uruchomi vmstat z odpowiednio dobranym zestawem opcji.
Uwaga: wybierz kilka głównych sposobów uruchamiania vmstat.
Nie jest konieczne implementowanie wszystkich opcji i trybów działania
programu.
Wskazówka: do zadawania w skrypcie pytania użytkownikowi użyj
polecenia echo. Do odczytywania odpowiedzi użyj polecenia
read lub line. Do sprawdzenia odpowiedzi użytkownika
(np. czy odpowiedział tak czy nie) użyj konstrukcji if
interpretera poleceń.
II. Zadania na tworzenie procesów
-
Napisz skrypt A, który uruchomi skrypt potomny B, który
z kolei zabije proces swojego rodzica (A). Sprawdź poleceniem
ps, czy osierocony proces zostanie poprawnie adoptowany przez
proces init.
-
Obmyśl jak wyprodukować proces zombie, wykonaj to, i sprawdź jak
pojawia się on na liście procesów ps (Linux, Solaris). Z kolei za
pomocą wbudowanego polecenia (funkcji systemowej) wait spowoduj
uwolnienie procesu zombie i jego poprawne zakończenie.
Wskazówka: interpreter poleceń bash zapobiega powstawaniu zombie
(gdy proces zombie jest uruchomionym przez bash skryptem).
III. Zadania na komunikację międzyprocesową
-
Uruchom potok co najmniej trzech poleceń działających przez jakiś
zauważalny czas. Mogą to być odpowiednio dobrane polecenia systemowe,
lub samodzielnie napisane skrypty. Sprawdź poleceniem ps jakie
zachodzi pokrewieństwo między tymi procesami (jeśli w ogóle zachodzi).
Wskazówka: ponieważ potok służy do przesyłania danych od procesu do
procesu, i synchronizuje pracę wszystkich procesów odpowiednio do
pojawiających się danych, dobrą metodą generowania demonstracyjnego
potoku jest umieszczenie na jego początku procesu, wysyłającego na
swoje wyjście stały strumień danych, np. piszącego w pętli co sekundę
jakiś krótki komunikat.
-
Poleceniem mknod utwórz potok nazwany (FIFO). Wywołując
polecenie cat w różnych okienkach spowoduj wpisywanie danych do
potoku przez jeden(ne) proces(y), i odczytywanie i wyświetlanie ich
przez inne. Zaobserwuj, kiedy polecenie cat czytające z potoku
czeka na więcej danych, a kiedy kończy pracę. Analogicznie, kiedy
czeka na więcej danych (z klawiatury) polecenie cat piszące do
potoku.
-
Utwórz potok nazwany (FIFO) i uruchom program cat piszący do
tego potoku. Następnie uruchom kilka procesów usiłujących
jednocześnie czytać z niego czytać. (Niech rejestrują on w swoich
indywidualnych plikach co przeczytały.) Pisz cierpliwie jakieś
wiersze tekstu na klawiaturze (dobrze sprawdza się wklejanie środkowym
klawiszem myszy). Po zakończeniu pisania sprawdź czy i co któremu
procesowi udało się przeczytać.
Czy na tej podstawie można określić (choćby słownie) algorytm w jaki
system rozdziela dane z pliku procesom o współdzielonym dostępie do
tego potoku?