I. Zadania na sygnały

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

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

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

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

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

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

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