Ważne komendy
-
trap
- służy do przechwytywania sygnałów wysłanych do procesu skryptu
- listę sygnałów można wyświetlić dodając opcję
-l
Ważne komendy
-
exit
- powoduje zakończenie działania procesu i przekazanie jego kodu wyjścia
kod
jest liczbą jednobajtową (tzn. z zakresu 0-255)
-
wait
- powoduje, że zadanie będzie czekało na zakończenie pracy przez procesy potomne i zwrócenie kodu ostatniego zadania jako wartości zwracaną przez polecenie
- można podać numery PID procesów, na jakie zadanie ma oczekiwać
Skróty
-
$$
- PID aktualnego procesu
-
$PPID
- PID nadrzędnego procesu (rodzica)
-
$!
- PID ostatnio uruchomionego procesu drugoplanowego
-
$?
- wartość zwrócona przez ostatnio wykonane polecenie pierwszoplanowe
Przesyłanie sygnału do procesu:
kill -s sygnał
PID
Zadania
Zadanie 1.
Napisz trzy skrypty.
Pierwszy skrypt powinien sprawdzić czy długości trzech odcinków pobranych jako argumenty są dodatnie.
Jeżeli tak, powinien jako kod wyjścia przekazać
1
, w przeciwnym razie
0
.
Drugi skrypt powinien sprawdzić czy z długości pobranych jako argument można zbudować trójkąt.
Jeżeli tak, powinien jako kod wyjścia przekazać
1
, w przeciwnym razie
0
.
Trzeci skrypt powinien uruchomić w tle pierwszy i drugi skrypt podając argumenty, które otrzymał oraz pobrać wynik zwrócone przez proces.
Następnie powinien wyświetlić informację, czy z pobranych jako argument, długości można zbudować trójkąt.
Zadanie 2.
Utwórz trzy skrypty. Pierwszy:
#!/bin/bash
trap ./napis.sh USR1
trap ./koniec.sh USR2
while true
do
sleep 5
done
exit 0
Drugi powinien wyświetlić dowolny napis, a trzeci przerwać
(zabić) proces skryptu.
Uruchom pierwszy skrypt. Następnie w drugim terminalu prześlij do procesu uruchamiającego skrypt
sygnał
USR1
oraz sprawdź co zostanie wyświetlone w pierwszym terminalu.
Następnie prześlij sygnał
USR2
.
Zadanie 3.
Przy pomocy skryptów utwórz symulator dwóch dźwigów, które przenoszą materiały budowlane z pierwszego miejsca do drugiego.
Pierwszy dźwig powinien przenosić z pierwszego miejsca do bufora pomocniczego,
o ograniczonej pojemności, natomiast drugi dźwig pobierać materiał z bufora do
drugiego miejsca.
Symulator powinien składać się z:
- trzech folderów, które będą symulowały: pierwsze miejsce, drugie miejsce, bufor;
- plików, które będą symulowały materiał budowlany, które będą znajdywały się w pierwszym miejscu;
- trzech procesów, które będą symulowały: pierwszy dźwig, drugi dźwig i nadzorce dźwigów.
Proces nadzorujący po otrzymaniu sygnału
USR1
powinien utworzyć dwa procesy symulujące prace dźwigów oraz uruchomić je w tle, natomiast po otrzymaniu sygnału
SIGINT
, zakończyć pracę dwóch utworzonych procesów i wyświetlić komunikat.
Proces symulujący pracę pierwszego dźwigu powinien przenosić pojedynczo pliki z pierwszego folderu
do folderu symulującego bufor, dopóki pierwszy folder nie będzie pusty. Po przeniesieniu wszystkich plików powinien
zakończyć swoje działanie zwracając liczbę przeniesionych plików. Należy też zadbać o to by nie
przenosił plików, jeżeli bufor przekroczy swoją pojemność (np. bufor może
mieć co najwyżej trzy pliki).
Proces symulujący pracę drugiego dźwigu powinien przenosić pojedynczo pliki z bufora
do drugiego folderu o ile w buforze jest jakiś plik oraz zakończyć swoje działanie
jeżeli pierwszy "dźwig" zakończył pracę oraz bufor jest już pusty. Po zakończeniu pracy proces
powinien zwrócić liczbę przeniesionych plików.
Proces nadzorujący (o ile nie zostanie przerwany przez użytkownika) po rozpoczęciu działania,
powinien nadzorować pracę dwóch dźwigów i wypisywać odpowiednie komunikaty
(odnośnie rozpoczęcia pracy dźwigu, zakończenia pracy dźwigu, liczby przeniesionych materiałów - dane pobrane od innych procesów).
Dodatkowo może posłużyć do komunikacji między procesami symulującymi pracę dźwigu oraz po zakończeniu ich pracy
powinien zakończyć swoje działanie.
Pamiętaj, że symulacja powinna zostać utworzona z dokładnie trzech procesów, które są odpowiednio zsynchronizowane
oraz każdy z tych procesów powinien kończyć swoje działanie w odpowiednim momencie.