Piszę serwer, który używa fork()
do odradzania procedur obsługi połączeń klientów. Serwer nie musi wiedzieć o tym, co dzieje się z rozwidlonymi procesami - działają one samodzielnie, a kiedy są gotowe, powinny po prostu umrzeć, zamiast stać się zombie. Jaki jest łatwy sposób na osiągnięcie tego?Jak mogę zapobiec procesom potomnym zombie?
Odpowiedz
Istnieje kilka sposobów, ale przy użyciu sigaction
z SA_NOCLDWAIT
w procesie macierzystym jest chyba najłatwiejszą:
struct sigaction sigchld_action = {
.sa_handler = SIG_DFL,
.sa_flags = SA_NOCLDWAIT
};
sigaction(SIGCHLD, &sigchld_action, NULL);
Jeszcze łatwiejsze: 'signal (SIGCHLD, SIG_IGN);' – domsson
używać podwójnych widelce. Poproś dzieci, aby natychmiast rozwinęły kolejną kopię i miały oryginalny proces potomny.
http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html
To jest prostsze niż przy użyciu sygnałów, moim zdaniem, bardziej zrozumiałe.
void safe_fork()
{
pid_t pid;
if (!pid=fork()) {
if (!fork()) {
/* this is the child that keeps going */
do_something(); /* or exec */
} else {
/* the first child process exits */
exit(0);
}
} else {
/* this is the original process */
/* wait for the first child to exit which it will immediately */
waitpid(pid);
}
}
Jednakże, jeśli ktoś chce zobaczyć drzewo procesu lub coś podobnego, to zepsuje to, prawda? – thejh
Nie jestem pewien, ale wydaje się prawdopodobne. – xaxxon
W systemach POSIX, rodzic dziecka zostanie zmieniony na INIT (PID = 1), więc tak, drzewo procesu nie będzie takie, jakiego można się spodziewać – Nick
Jak pozbyć się procesów zombie?
Nie możesz zabić procesu zombie sygnałem SIGKILL podczas zabijania normalnego procesu, ponieważ proces zombie nie może odebrać żadnego sygnału. więc posiadanie dobrego nawyku jest bardzo ważne.
Kiedy programujesz, jak pozbyć się procesów zombie? Zgodnie z powyższym opisem, proces potomny będzie wysyłać sygnały SIGCHLD do procesu macierzystego, gdy jego matryce. domyślnie ten sygnał jest ignorowany przez system, więc najlepszym sposobem jest to, że możemy wywołać funkcję wait() w funkcji przetwarzania sygnału, która może zapobiec zombie w systemie. zobacz więcej na ten temat: http://itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/
- 1. Wykrywanie zombie ios
- 2. zapobiega zawijaniu linii w elemencie potomnym Flexbox
- 3. Konsumenci "Zombie" RabbitMQ
- 4. Dlaczego istnieją procesy zombie?
- 5. Jak mogę zapobiec generowaniu atrybutu sprawdzania poprawności?
- 6. Jak mogę zapobiec podsycaniu podobiektów przez rtęć?
- 7. Jak mogę zapobiec bezimiennej struct \ union?
- 8. Jak mogę zapobiec atakom brutalnej siły?
- 9. Jak mogę zapobiec przekierowaniu Spring MVC?
- 10. Nieobowiązkowe przełączniki kontekstowe: jak mogę im zapobiec?
- 11. Jak mogę zapobiec współbieżnym kompilacjom w CruiseControl.NET?
- 12. Jak mogę zapobiec ładowaniu pakietu przez R.?
- 13. Jak mogę zapobiec importowaniu samego modułu Pythona?
- 14. Jak mogę zapobiec gradientowi pasków CSS?
- 15. Jak mogę zapobiec zmianie rozmiaru okien Emacsa?
- 16. Jak mogę zapobiec sierotom z tekstu HTML?
- 17. Czy mogę zapobiec przypisywaniu obiektów?
- 18. es6 reagowanie na rekwizyty w komponencie potomnym
- 19. Najprostszy sposób sygnalizowania zdarzenia kilku procesom w .NET
- 20. Czy mogę zapobiec zdarzeniu związanemu z rozmyciem?
- 21. Filtr XPath nie jest pustym elementem potomnym
- 22. Serializacja typu Json.Net z polimorficznym obiektem potomnym
- 23. Jak mogę zapobiec zaznaczaniu tekstu w Google Chrome?
- 24. Jak mogę zapobiec uruchamianiu mojej aplikacji wiele razy?
- 25. Jak mogę zapobiec AppDomainUnloadedException po NUnit testuje kod PLINQ?
- 26. Jak mogę zapobiec wyświetlaniu tabeli HTML przez program asp: RadioButtonList?
- 27. Jak mogę zapobiec aktualizacji wartości w JQuery UI Spinner?
- 28. Jak mogę zapobiec przeskakiwaniu kursora po zamknięciu nawiasów w Emacs?
- 29. Jak mogę zapobiec warunkom wyścigu, korzystając z usługi Redis?
- 30. Jak mogę zapobiec autouzupełnianiu klawiatury w MobileSafari/UIWebView?
To prawdopodobnie jest najprostszym sposobem: http://stackoverflow.com/questions/7171722/how-can-i-handle-sigchld-in-c/7171836 # 7171836 – andrewsh
@andrewsh Oh, nice. Czy uważasz, że pytania są wystarczająco podobne, aby oznaczyć to jako duplikat? – thejh