Procesy

Algorytm Wait

Autorzy: Bartłomiej Kijanka, Paweł Piechocki



1.0 Interfejs Programisty

Gdybyśmy chcięli zsynchronizować działanie procesu z zakończeniem jego procesów potomnych, umożliwią nam to systemowe funkcje:

Funkcja wait() wstrzymuje wywołujący ją proces do momentu, aż jeden z jego procesów potomnych przestanie działać. Funkcja waitpid() proces wywołujący do momentu, aż potomek określony przez pid przestanie działać.

Jeżeli któryś z procesów potomnych osiągnął wymagany stan przed wywołaniem wait(), to funkcja wraca natychmiast. Podobnie, gdy proces nie ma żadnych potomków, tyle, że tym razem wraca z błędem -1.

Kiedy proces potomny się kończy, do ojca przesyłane są informacje o jego stanie (np. exit_code) i jego PID. Te dane są zawarte w zmiennej addr_stat.

Powyższe funkcje są interfejsem dla wewnętrznej funkcji:

asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru);



2.0 Parametry


Dopuszczalne wartości parametrów dla sys_wait4 to:

2.1 pid

2.2 options

Jeśli nie podamy ani __WALL, ani __WCLONE, wait będzie czakać wyłącznie na normalne dzieci.

2.3 stat_addr

Służy do zwracania informacji o zakończonym procesie; dane są zawarte w pierwszych 2 bajtach tej zmiennej. Możliwe wartości to:

Wydarzenie Starszy Bajt Młodszy Bajt
Proces zakończył się prawidłowo exit_code 0
Proces został wstrzymany exit_code 0x7f
Proces został zabity sygnałem 0 numer sygnału

2.4 ru

Wskaźnik do struktury rusage, w której pamiętane są informacje o korzystaniu z zasobów takie jak np. czas w trybie użytkownika i czas w trybie jądra. Podanie wartości NULL oznacza, że nie interesują nas te informacje. Struktura ta jest wypełniana za pomocą funkcji getrusage().


3.0 Rezultat


Udane wywołanie sys_wait4 zwraca pid procesu którego się doczekaliśmy. Oprócz tego mogą zostać zwrócone następujące kody błędów:



4.0 Algorytm