2013-06-10 14 views
13

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?

+1

To prawdopodobnie jest najprostszym sposobem: http://stackoverflow.com/questions/7171722/how-can-i-handle-sigchld-in-c/7171836 # 7171836 – andrewsh

+0

@andrewsh Oh, nice. Czy uważasz, że pytania są wystarczająco podobne, aby oznaczyć to jako duplikat? – thejh

Odpowiedz

11

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

Jeszcze łatwiejsze: 'signal (SIGCHLD, SIG_IGN);' – domsson

5

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

Jednakże, jeśli ktoś chce zobaczyć drzewo procesu lub coś podobnego, to zepsuje to, prawda? – thejh

+0

Nie jestem pewien, ale wydaje się prawdopodobne. – xaxxon

+0

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

0

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/

Powiązane problemy