Sto scrivendo un server che utilizza fork()
per spawnare i gestori per le connessioni client. Il server non ha bisogno di sapere cosa succede ai processi biforcati: lavorano da soli e, una volta terminato, dovrebbero morire invece di diventare zombi. Qual è un modo semplice per realizzare questo?Come posso prevenire i processi figli di zombie?
risposta
Ci sono diversi modi, ma utilizzando sigaction
con SA_NOCLDWAIT
nel processo padre è probabilmente il più semplice:
struct sigaction sigchld_action = {
.sa_handler = SIG_DFL,
.sa_flags = SA_NOCLDWAIT
};
sigaction(SIGCHLD, &sigchld_action, NULL);
Ancora più semplice: 'segnale (SIGCHLD, SIG_IGN);' – domsson
Utilizzare forche doppie. Chiedi ai tuoi figli di biforcarsi immediatamente un'altra copia e di uscire dal processo figlio originale.
http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html
Questo è più semplice rispetto all'utilizzo di segnali, a mio parere, e più comprensibile.
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);
}
}
Tuttavia, se qualcuno vuole vedere un albero del processo o qualcosa del genere, questo lo rovinerà, giusto? – thejh
Non sicuro, ma sembra probabile. – xaxxon
Sui sistemi POSIX, il genitore del bambino sarà cambiato in INIT (PID = 1), quindi sì, l'albero del processo non sarà quello che ci si sarebbe aspettato – Nick
Come sbarazzarsi dei processi zombi?
non si può uccidere il processo di zombi con il segnale SIGKILL mentre si uccide un processo normale, poiché il processo zombi non può ricevere alcun segnale. quindi avere una buona abitudine è molto importante.
Quindi, quando si programma, come eliminare la quantità di processi zombi? Secondo la descrizione di cui sopra, il processo figlio invierà i segnali SIGCHLD al processo genitore quando muore. per impostazione predefinita, questo segnale viene ignorato dal sistema, quindi il modo migliore è che possiamo chiamare wait() nella funzione di elaborazione del segnale, che potrebbe evitare il bastone zombi nel sistema. vedere di più su questo: http://itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/
- 1. Come trovare tutti i processi figli?
- 2. Avere Supervisord Riavvia periodicamente i processi figli
- 3. Prevenire i processi per eseguire alcune chiamate di sistema
- 4. Come si elencano tutti i processi figli in python?
- 5. INIT mai raccogliendo zombie/processi defunte
- 6. Come pulire i processi figli su child_process.spawn() in node.js
- 7. Come posso fare in modo che Perl aspetti i processi figli avviati in background con system()?
- 8. Zombie elabora
- 9. Come limitare i processi figlio di Jenkins?
- 10. Come tracciare tutti i file aperti da un processo e i suoi processi figli?
- 11. Come calcolare l'utilizzo della CPU di un processo e tutti i suoi processi figli in Linux?
- 12. Come posso terminare tutti i processi di subshell?
- 13. Come posso salvare i miei record figli dal controller principale?
- 14. Come analizzare i nodi figli?
- 15. Come posso fare in modo che il mio script Perl usi più core per i processi figli?
- 16. Come eseguire Esoteric Language ZOMBIE
- 17. Come cercare i figli di un HTMLDivElement?
- 18. Clienti RabbitMQ "Zombie"
- 19. Popen.communicate() genera OSError: "[Errno 10] Non ci sono processi figli"
- 20. Golang: I processi figlio diventano Zombi
- 21. Come posso condividere la memoria tra i processi in MATLAB?
- 22. Oracle - Zombie Table
- 23. Come confrontare i processi Matlab?
- 24. È possibile che i processi figli in Node.js conservino l'output colorato?
- 25. Posso escludere i figli dell'elemento originale in ReactJS?
- 26. come vengono richieste simultanee gestite in PHP (usando - discussioni, pool di thread o processi figli)
- 27. Come posso generare processi concomitanti con PHP?
- 28. Prevenire i puntatori locali
- 29. Come prevenire i reindirizzamenti in CasperJS?
- 30. Domanda su processori e thread zombie
Questo, probabilmente, è il modo più semplice: http://stackoverflow.com/questions/7171722/how-can-i-handle-sigchld-in-c/7171836 # 7171836 – andrewsh
@andrewsh Oh, bello. Pensi che le domande siano abbastanza simili da contrassegnarle come duplicate? – thejh