Funkcja systemowa exit kończy działanie procesów w systemie LINUX.
Wywoływana jest ona z parametrem (kodem zakończenia), który zostaje przekazany
rodzicowi procesu. Funkcja ta nie zwraca żadnej wartości.
Opis algorytmu:
- Jeżeli proces jest w trakcie obsługi przerwania, wtedy wyświetlany jest na konsoli odpowiedni komunikat i algorytm przechodzi do punktu 2.
- O ile w systemie ustawiony jest znacznik zapisu pliku rozliczeniowego, do tego pliku zostanie dopisany rekord z następującymi danymi:
- szesnastoliterowy skrót nazwy programu;
- czas pracy procesu w trybie użytkownika;
- czas pracy procesu w trybie jądra;
- czas rozpoczęcia pracy przez proces;
- czas trwania procesu w systemie;
- identyfikator użytkownika;
- identyfikator grupy;
- identyfikator terminala;
- opis pracy (tzn. czy wykonany był fork, po którym nie nastąpił exec;
czy proces korzystał z przywilejów nadzorcy;
czy został wykonany zrzut pamięci; czy proces zakończył działanie w wyniku otrzymania sygnału)
- kod zakończenia procesu;
- Każdy proces może mieć swój prywatny zegar. W tym kroku algorytmu usuwany jest prywatny zegar procesu z listy zegarów.
- Wykonując operacje na semaforach można użyć znacznika SEM_UNDO, pozwalającego cofnąć te operacje. Operacje te zapisywane są na specjalnej liście w strukturze procesu. Korzystając z tej listy algorytm cofa tak wykonane działania na semaforach.
- Jeżeli proces korzystał z kolejki komunikatów jądra, to zostaje od niej odłączony. W przypadku gdyby okazało się, że z kolejki tej nie korzysta żaden proces, to jest ona usuwana.
- Zwalniana jest teraz pamięć przydzielona procesowi na segment danych, segment kodu oraz tablicę stron. Zwolnienie pamięci jest wykonywane jedynie wtedy, gdy nie korzystają z niej aktualnie inne procesy.
- W tym kroku algorytmu zamykane są deskryptory, które zostały otwarte przez proces. Zbiór tych deskryptorów umieszczony jest w odpowiedniej strukturze. Podobnie jak przy zwalnianiu pamięci, deskryptory te są zamykane tylko wtedy, gdy ze struktury zawierającej je nie korzystają inne procesy.
- W strukturze procesu znajduje się pole wskazujące na strukturę opisującą i-węzły katalogu bieżącego i głównego. O ile ze struktury tej nie korzystają inne procesy, zwalniane zostają te i-węzły oraz pamięć przydzielona na tą strukturę.
- Każdy proces ma tablicę obsługi sygnałów (opisaną w rozdziale związanym z sygnałami). Jeżeli z tablicy tej nie korzysta żaden inny proces, wtedy zwolnioona zostaje pamięć przydzielona na strukturę związaną z tą tablicą.
- Zostaje zmieniony stan procesu na ZOMBIE.
- Jeżeli proces jest liderem grupy procesów, do wysyłany zostaje do każdego procesu z tej grupy sygnał zawieszenia.
- Wsłany zostaje ojcu procesu sygnał o śmierci potomka.
- Każdemu dziecku procesu wykonującegu exit jako ojciec przypisany zostaje proces INIT oraz lista tych dzieci zostaje dołączona do listy dzieci procesu INIT. Jeżeli któreś z dzieci jest w stanie ZOMBIE, wtedy do procesu INIT wysyłany zostaje sygnał o śmierci dziecka.
- Jeżeli ustawiony jest w systemie odpowiedni znacznik, wykonywane jest teraz sprawdzenie drzewa procesów w systemie. Dla każdego procesu z tablicy procesów sprawdzane jest:
- czy istnieje ojciec procesu w tablicy procesów;
- czy istnieje najmłodsze dziecko w tablicy procesów;
- czy istnieje młodsze rodzeństwo w tablicy procesów;
- czy istnieje starsze rodzeństwo w tablicy procesów;
- czy ojcem procesu nie jest on sam;
- czy najmłodszym dzieckiem nie jest on sam;
- czy starszym rodzeństwem nie jest on sam;
- czy młodszym rodzeństwem nie jest on sam;
- czy ojcem starszego i młodszego rodzeństwa jest jego ojciec;
- czy starszym rodzeństwem młodszego rodzeństwa jest on sam;
- czy młodszym rodzeństwem starszego rodzeństwa jest on sam;
- czy ojcem najmłodszego dziecka jest on sam;
- czy młodszym rodzeństwem najmłodszego dziecka jest NULL;
W przypadku wykrycia błędu na konsoli wyświetlane jest stosowne ostrzeżenie.
- Zwolniona zostaje pamięć przydzielona procesowi na potrzebne struktury.
- Ostatnim krokiem algorytmu jest wywołanie funkcji wykonującej szeregowanie procesów.
Proces nie powinien wrócić z tej funkcji, gdyż powinien zostać zmieniony kontekst a sterowanie przekazane innemu procesowi. Proces ten nie powinien nigdy zostać wybrany przez funkcję szeregującą procesy, gdyż jest on w stanie ZOMBIE.
Gdyby jednak zdarzyło się inaczej, to wykonany zostanie skok do kroku 2 algorytmu.
Algorytm ten zaimplementowany jest w pliku exit.c.
Bibliografia
- kod źródłowy funkcji
do_exit
z pliku exit.c
Autor: Jacek Drzycimski