I. Zadania na sygnały
-
Napisz program wykonujący jakąś trywialną operację (np. i=1;)
w nieskończonej pętli. Skompiluj i uruchom program, a następnie
programem top sprawdź, czy Twój program pokazuje się w czołówce
programów wykorzystujących cykle obliczeniowe komputera. Przed
przejściem do dalszych prac zabij program klawiszem Ctrl-C.
Dodaj w pętli opóźnienie (sleep(1);) i upewnij się, że po
uruchomieniu tego programu nie pojawia się on już na szczycie listy
top.
-
Napisz skrypt, który w pętli będzie coś robił (np. co sekundę
wypisywał bieżącą godzinę). Sprawdź wysyłanie do procesu różnych
sygnałów (SIGINT, SIGQUIT, ale także SIGFPE,
SIGILL). Następnie rozbuduj skrypt o przechwytywanie tych
sygnałów (trap) i sprawdź, że to działa, to znaczy, że tak
napisanego procesu nie da się zabić tymi sygnałami. Sprawdź możliwość
uśmiercenia sygnałem SIGKILL procesu, który przechwytuje
wszystkie 15 podstawowych sygnałów.
-
Wykorzystując program, który wykonuje nieskończoną pętlę (ale
obowiązkowo z uwzględnieniem opóźnienia w pętli), uruchamiaj i zabijaj
go wysyłając mu różne sygnały poleceniem kill. Dodaj w
programie przechwytywanie sygnału/ów, i wypróbuj następujące reakcje:
(a) zakończenie pracy programu po wyświetleniu komunikatu, (b)
wyświetlenie komunikatu i powrót do wykonywania programu, (c)
całkowite ignorowanie sygnału.
-
Sprawdź możliwość zawieszania procesu sygnałem SIGSTOP i
wznawiania sygnałem SIGCONT. Sprawdź, że sygnał SIGSTOP
daje taki sam efekt jak naciśnięcie klawisza Ctrl+Z na
terminalu. Sprawdź, że sygnał SIGCONT daje taki sam efekt jak
wykonanie polecenia fg lub bg (którego bardziej?).
II. Zadanie na sterowanie zasobami i priorytetami
-
Zapoznaj się z poleceniem ulimit. Ustaw liczbę procesów na
małą wartość i sprawdź, czy działanie jest respektowane. Następnie
napisz skrypt, który w nieskończonej pętli uruchamia kolejne kopie
samego siebie w tle. {\bf Uruchom skrypt koniecznie w tej powłoce, w
której ograniczyłeś/ograniczyłaś maksymalną liczbę procesów!}
Następnie spróbuj opanować sytuację, czyli pozabijać wszystkie
utworzone procesy i powrócić do normalnej pracy.
-
Ustaw jakieś absurdalnie niskie ograniczenia twarde zasobów i sprawdź,
jak można uniemożliwić podprocesom normalną pracę, nawet jeśli
spróbują one manipulować swoimi ograniczeniami.
-
Sprawdź wartości priorytetów procesów i ich liczby nice, a
następnie przećwicz obniżanie priorytetu pracującego w tle procesu
(nice/renice). Czy potrafisz zademonstrować działanie
obniżonego liczbą nice priorytetu?