2014-11-18 13 views
7

Dlaczego Linux bierze pod uwagę proces, którego główny wątek zakończył się w procesie zombie, i czy istnieje sposób, aby tego uniknąć?Proces zombie, mimo że wątki wciąż działają.

W kodzie poniżej I:

  1. stworzenie procesu z główną nici
  2. utworzyć nowe odłączony gwint
  3. pthread_exit główny gwint
  4. pthread_exit oderwany gwint

Przed # 3, ps(1) pokazuje mój proces jako normalny pro cess. Po 3, jednak, ps(1) pokazuje mój proces jako zombie (np. 2491 pts/0 00:00:00 thread-app <defunct>) , mimo że nadal ma działające wątki.

Czy można opuścić główny wątek, ale unikać wchodzenia w stan zombie?

Kod:

#include <stdio.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdlib.h> 

void *thread_function(void *args) 
{ 
printf("The is new thread! Sleep 20 seconds...\n"); 
sleep(20); 
printf("Exit from thread\n"); 
pthread_exit(0); 
} 

int main(int argc, char **argv) 
{ 
pthread_t thrd; 
pthread_attr_t attr; 
int res = 0; 
res = pthread_attr_init(&attr); 
res = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
res = pthread_create(&thrd, &attr, thread_function, NULL); 
res = pthread_attr_destroy(&attr); 
printf("Main thread. Sleep 5 seconds\n"); 
sleep(5); 
printf("Exit from main process\n"); 
pthread_exit(0); 
} 

# ./thread-app 
+1

może chcesz 'ptherad_join()'? –

+0

Chcę nowy wątek, który będzie żył dłużej niż oryginalny wątek główny. I ta główna nić jest zniszczona poprawnie, bez bycia zombie. – likern

+0

, więc chcesz odłączyć wątek od średniej nici za pomocą http://linux.die.net/man/3/pthread_detach :) – MimiEAM

Odpowiedz

4

Jest to znany problem. A fix proposed jakiś czas temu przez Kaz nie został zaakceptowany przez Ulricha Dreppera. Jego komentarz był:

I haven't looked at the patch nor tried it. 

If the patch changes the behavior that the main thread, after calling 
sys_exit, still react to signals sent to this thread or to the process 
as a whole, then the patch is wrong. The userlevel context of the 
thread is not usable anymore. It will have run all kinds of 
destructors. The current behavior is AFAIK that the main thread won't 
react to any signal anymore. That is absolutely required. 

Czytaj łańcuch mail dla dalszych dyskusji na ten temat tutaj:

http://lkml.iu.edu/hypermail/linux/kernel/0902.0/00153.html

3

operacyjne System uważa swój proces jest Mr ponieważ głównym gwintem, który został uruchomiony przez system operacyjny, powrócił (to jest zakończony). Jeśli nie chcesz tego zachowania, nie ma wyjścia głównego wątku.

+1

Dodałbym, że jest to nominalny zombie ("nomobie"?). Zakończenie wątku głównego przez 'pthread_exit' podczas działania innych wątków _nie powoduje generowania SIGCHLD, ani nie przerywa żadnych połączeń typu' wait'-like w rodzicu. Proces jest "nieważny" mniej więcej z perspektywy _ps (1) _. – pilcrow

+1

Cóż, wszystkie wątki są uruchamiane przez system operacyjny w tym sensie. 'pthread_exit()' z definicji powinien wychodzić tylko z bieżącego wątku, tak jak wtedy, gdy jest wywoływany z dowolnego innego wątku. Tak więc rozsądnie jest oczekiwać, że wątek główny zachowuje się tak, jak każdy inny wątek w procesie. Ale oczywiście tak nie jest. –

+0

Oczywiście wątek główny * nie jest * jak każdy inny wątek: to * nie * musi być tworzone przez 'pthread_create()', a system operacyjny może traktować jego zakończenie jako specjalne. –