Zadanie
Wstęp
Sygnały maj dwie wady, które utrudniaj ich wykorzystanie przy komunikacji procesów:
Przy istniejcych sygnałach (używanych przez system) nie jest to zbytnio kłopotliwe, ponieważ s one wykorzystywane akurat w takich sytuacjach, gdzie taka wiedza jest zbyteczna. Można by jednak wzbogacić w ten sposób sygnał użytkownika.
Zadanie
Zmodyfikować obsługę jednego z sygnałów użytkownika (np. SIGUSR1) w następujcy sposób:
- proces p1, który wysyła sygnał SIGUSR1 do procesu p2 sprawdza, czy p2 już taki sygnał odebrał:
- kiedy proces p2 kończy obsługę sygnału SIGUSR1, sprawdza czy s procesy czekajce na wysłanie do niego sygnału. Jeżeli s, pozawala jednemu na wysłanie sygnału.
Szkic rozwizania
Należy zmodyfikować następujce funkcje:
generate w pliku exit.c: Jeżeli sygnał wysyłany to SIGUSR1, funkcja powinna sprawdzić, czy odpowiedni bit p->signal jest ustawiony. Jeżeli jest, należałoby zatroszczyć się o zawieszenie procesu current
jedn z funkcji obsługujcych otrzymywanie sygnałów w "sprzętowym" signal.c, np. handle_signal: Należy wprowadzić odwieszanie procesów po obsłudze sygnału
Rzeczy, na które należy zwrócić uwagę:
Wersja trudniejsza
Jak już mamy jednoznaczn odpowiedniosć między wysłaniem sygnału a jego odebraniem, możemy umożliwić identyfikację procesu wysyłajcego sygnał, wprowadzajc np. now funkcję systemow: int sys_whosent(struct task_struct *p), która zwraca pid procesu, który przysłał sygnał, lub błd, kiedy nie ma ustawionego bitu w polu signal. Funkcja taka mogłaby być wywoływana przez handlera sygnału.
Testy
Testy raczej sprawdzałyby działanie nowego mechanizmu niż sprawdzały jak bardzo jest efektywny. Możnaby np. uruchomić proces, który blokuje sygnał SIGUSR1, a następnie sprawdzić, czy procesy wysyłajšce do niego sygnał istotnie się zawieszajš.
Autor Mikolaj Bojanczyk