Należy rozbudować system Minix o serwer, który będzie się zajmował dostarczaniem informacji o zakończonych procesach.
- Pierwszy z interfejsów, dostępny dla procesów systemowych obejmuje:
-
int watch_exit(endpoint_t ep)- deklaracja zainteresowania zdarzeniem zakończenia procesu o numerzeep(taki proces będziemy nazywać obserwowanym), -
int cancel_watch_exit(endpoint_t ep)- odwołanie powyższego zainteresowania, -
w sytuacji gdy kończy się obserwowany proces, każdy z obserwujących go procesów powinien otrzymać od serwera wiadomość
notify, -
int query_exit(endpoint_t *epp)- funkcja zwracająca numer któregoś z obserwowanych przez nadawcę procesów który się zakończył oraz bieżącą liczbę procesów obserwowanych przez proces wywołujący, które się zakończyły, a nie zostały jeszcze zwrócone poprzez tą funkcję. Każdy z zakończonych procesów powinien być zwrócony w tym trybie co najwyżej jeden raz.Implementacje opisanych powyżej funkcji powinny zostać dodane do biblioteki systemowej dla procesów systemowych (np. w
lib\libsys\).
- Drugim interfejsem, tym razem dostępnym dla wszystkich procesów, jest:
-
int wait_exit(pid_t p)- wywołanie blokujące, które zwraca sukces po zakończeniu procesu o identyfikatorzep. W przypadku braku takiego procesu lub przerwania za pomocą sygnału zwraca-1oraz ustawiaerrnoodpowiednio naESRCHiEINTR.Implementacja opisanej powyżej funkcji powinna zostać dodana do biblioteki systemowej (np. w
lib\libc\sys-minix\).
Sygnały przychodzące do zablokowanych na wait_exit procesach powinny być natychmiast obsługiwane zgodnie z zarejestrowanymi przez proces procedurami obsługi. Funkcja wait_exit powinna zostać przerwana i zwrócić wartość -1 oraz EINTR w errno.
Jeśli proces mający pid $k jest zablokowany w oczekiwaniu na zakończenie procesu w to w katalogu \proc\$k powinien się znaleźć plik waiting_for wewnątrz którego powinna się znaleźć dziesiętna reprezentacja pid'u procesu w. W pozostałych przypadkach plik powinien być pusty lub nie istnieć.
Implementacja tej funkcjonalności jest nieobowiązkowa i będzie traktowana jako trzecie małe zadanie.
Rozwiązanie będzie testowane w systemie MINIX 3.2.1. Katalog 'src/tst/' zawiera implementację serwera oferującego schowek na liczbę:
- operacje 'store' i 'retrieve' domyślnie są blokujące,
- nieblokujące odpowiedniki to 'store_nb' oraz 'retrieve_nb',
- liczba przechowywana w schowku jest automatycznie usuwana jeśli proces który ją tam złożył kończy działanie (m.in. do tego używany jest testowany server),
Katalog 'Tests/' zawiera kilka testów do uruchamiania z poziomu użytkownika:
- testy korzystają z serwera 'tst'
- implementacja automatycznych testów znajduje się w 'tsrc',
- dla uproszczenia instalacji funkcje dostępu do serwera 'tst' są zaimplementowane w nagłówku 'inc/tst_lib.h',
- do uruchamiania testów służy skrypt 'test.sh',
- można mu podać jeden argument który zostanie użyty jako nazwa serwera 'tst' (w 'minix_rs_lookup'),
- gdy brak argumentu, domyślna nazwa to "tst",
- warto uruchomić kilka serwerów (opcja '-label' dla 'service') i uruchamiać testy równocześnie na kilku instancjach (nie za wielu bo może braknąć procesów),
- katalog 'utils' zawiera programy wykonujące pojedyncze operacje (do testowania z konsoli).
src/odzwierciedla fragment struktury katalogów źródeł systemu MINIX. Fragment ten zawiera niektóre katalogi w których, mogą się znaleźć części implementacji. W celu przetestowania należy skopiować zawartość katalogusrcz repozytorium do katalogu/usr/srcw MINIX'e. Wskutek tego część plików oryginalnych źródeł zostanie nadpisana. Następnie należy zainstalować include'y, przekompilować i zainstalować odpowiednie biblioteki, nowy serwer oraz dostarczony serwertst. Aby umożliwić zmiany w podstawowych serwerach systemowych (np. w PM) przed testowaniem zostanie również przekompilowany i zainstalowany obraz systemu. Po restarcie systemu, nowa funkcjonalność powinna działać po uruchomieniu serwera.Tests/zawiera źródła testów do wywoływania jako użytkownik.