2013-06-10 15 views
13

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?

+1

Questo, probabilmente, è il modo più semplice: http://stackoverflow.com/questions/7171722/how-can-i-handle-sigchld-in-c/7171836 # 7171836 – andrewsh

+0

@andrewsh Oh, bello. Pensi che le domande siano abbastanza simili da contrassegnarle come duplicate? – thejh

risposta

11

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); 
+0

Ancora più semplice: 'segnale (SIGCHLD, SIG_IGN);' – domsson

5

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); 
    } 
} 
+3

Tuttavia, se qualcuno vuole vedere un albero del processo o qualcosa del genere, questo lo rovinerà, giusto? – thejh

+0

Non sicuro, ma sembra probabile. – xaxxon

+0

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

0

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/

Problemi correlati