I. Narzędzia systemowe i pisanie skryptów

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

  2. 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

  1. 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.

  2. 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ą

  1. 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.

  2. 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.

  3. 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?