Procesy

Algorytm Exit

Autor: Paweł Piechocki



exit kończy działanie wywołującego procesu, zwalnia odpowiednie struktury, pamięć, zamyka pliki itp, a także (opcjonalnie) zapisuje informacje o procesie do pliku księgowania. Jako jedyny parametr bierze kod wyjścia programu. Jesli nie jest wywołany przez programistę, zostanie wywołany niejawnie po opuszczeniu funkcji main().


1.0 Deklaracja


exit jest zdefiniowane w pliku unistd.h. Schemat wywołań jest zależny od architektury (np. na i386 wykorzystywane jest wywołanie pośrednie poprzez procedurę obsługi przerwania 80h) jednak sprowadza się to zawsze w ostateczności do procedur zadeklarowanych w pliku exit.c: sys_exit i do_exit. do_exit składa się z wywołań podprocedur dokonujących różnych czynności porządkowych i kończących dla aktualnego procesu.


2.0 long sys_exit(int error_code)

Wywołuje do_exit z parametrem error_code przesuniętym o 8 bitów w lewo.


3.0 void do_exit(long code)



Ta procedura nigdy nie zwraca sterowania. Operuje ona (i jej podprocedury) na polach struktury task_struct aktualnego procesu.
Algorytm:


Uwaga: do_exit panikuje przy próbie wywołania z prosesów idle i init oraz z procedury obsługi przerwania.

Szczegóły:

3.1 static void do_acct_process(long exitcode, struct file *file)


Tworzy, wypełnia i zapisuje do pliku księgowania strukturę z informacjami o procesie. Jest wywoływana jeśli zdefiniowano makro CONFIG_BSD_PROCESS_ACCT

z acct.h :

struct acct

 

3.2 static inline void __exit_mm(struct task_struct * tsk)



Zeruje pole mm w strukturze procesu, i zwalnia pamięć jeśli nikt więcej z niej nie korzysta.

3.3 void sem_exit (void)


Odwraca wszytkie operacje semaforowe zapamiętane w current->semundo i usuwa proces z kolejki czekających na semaforze.

3.4 static inline void __exit_files(struct task_struct *tsk)


Zeruje pole files w strukturze procesu i zwalnia (zamyka) pliki, jeśli żaden inny proces z nich nie korzysta.

3.5 static inline void __exit_fs(struct task_struct *tsk)


Zeruje pole fs w strukturze procesu i zwalnia tę strukture jeśli żaden inny proces z niej nie korzysta.

3.6 void exit_sighand(struct task_struct *tsk)


Zwalnia strukturę przechwującą informacje o sygnałach.