Pracuję nad kodem serwera, który używa fork()
i exec do tworzenia procesów potomnych. Identyfikator PID dziecka jest rejestrowany, gdy fork()
powiedzie się i zostanie wyczyszczony, gdy zostanie przechwycony sygnał CHILD
.Czy sygnał ZABISKU natychmiast opuszcza proces?
Jeśli serwer musi się zatrzymać, wszystkie programy zostają zabite, ewentualnie z sygnałem KILL. Teraz działa to poprzez iterowanie wszystkich zarejestrowanych PID i czekanie, aż funkcja obsługi sygnału CHILD usunie PID. To się nie powiedzie, jeśli program potomny nie zakończył poprawnie działania. Dlatego chcę użyć kill
w połączeniu z waitpid
, aby upewnić się, że lista PID jest wyczyszczona i zaloguj się, i wykonaj inne czynności w przeciwnym razie.
Rozważmy kolejny przykładowy kod:
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
Wyciąg z waitpid(2)
:
waitpid(): w przypadku sukcesu zwraca identyfikator procesu dziecka, którego stan uległ zmianie; jeśli podano WNOHANG i jeden lub więcej potomków określony przez pid istnieje, ale jeszcze nie zmieniono stanu, to zwracane jest 0. W przypadku błędu zwracane jest -1.
Czy proces wydany przez pid
zawsze zniknął, zanim uruchomi się następna funkcja? Czy waitpid
zawsze zwróci -1
w powyższym przypadku?
Sygnał KILL jest raczej brutalny, dlaczego nie INT lub HUP? A także, jaki jest kod powrotu 'kill' syscall? – fge
"czekanie na obsługę sygnału DZIECKO do ..." - Nie ma obsługi sygnału dla SIGKILL, wiesz? Wszystkie sygnały, z wyjątkiem SIGSTOP i SIGKILL, wykonają to, co zostało ustawione przez 'sigaction' (na przykład wywołaj procedurę obsługi) lub domyślną. SIGSTOP po prostu się zatrzymuje, a SIGKILL po prostu zabija ten proces. Zawsze. Nie ma obsługi ani warunkowego. (Wyjątkiem jest to, że 'kill' syscall nie działa, ponieważ nie masz wystarczających praw.) – Damon
@Damon:' SIGKILL' nie może być zignorowany przez proces docelowy, to prawda. Ale to nie jest pytanie/problem.Wywołanie systemowe 'kill (2)' w procesie źródłowym może powrócić zanim sygnał zostanie oceniony (przez jądro) w kontekście procesu docelowego. 'kill (2)' jest po prostu bardzo prostą asynchroniczną komunikacją i musi być traktowane jako takie ze wszystkimi implikacjami. –