2014-11-18 4 views
7

Warum betrachtet Linux einen Prozess, dessen Hauptzweig ein Zombie-Prozess ist, und gibt es eine Möglichkeit, dies zu vermeiden?Zombie-Prozess, obwohl Threads noch laufen

In dem folgenden Code I:

  1. einen Prozess mit einem
  2. Hauptthread erstellen
  3. Erstellen ein neues frei stehendes Gewindes
  4. pthread_exit den Haupt-Thread
  5. pthread_exit der abgelöste Faden

Vor # 3, ps(1) zeigt mein Prozess wie ein normaler Profi cess. Nach # 3 zeigt ps(1) jedoch meinen Prozess als Zombie (z. B. 2491 pts/0 00:00:00 thread-app <defunct>) , obwohl es noch laufende Threads hat.

Ist es möglich, den Hauptthread zu beenden, aber vermeiden, in einen Zombie-Zustand zu gehen?

Code:

#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

vielleicht möchten Sie 'ptherad_join()'? –

+0

Ich möchte einen neuen Thread, der länger als der ursprüngliche Hauptthread leben wird. Und dieser Hauptfaden wird korrekt zerstört, ohne Zombie zu sein. – likern

+0

also wollen Sie den Thread aus dem mittleren Thread mit Hilfe von http://linux.die.net/man/3/pthread_detach :) – MimiEAM

Antwort

4

Dies ist ein bekanntes Problem. Eine fix proposed vor einiger Zeit von Kaz wurde von Ulrich Drepper nicht akzeptiert. Sein Kommentar dazu war:

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. 

Lesen Sie die E-Mail-Kette für weitere Diskussion zu diesem Thema hier:

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

3

Das Betriebssystem denkt Ihr Prozess ein Zombie ist, weil der Haupt-Thread, die durch das Betriebssystem gestartet wurde, zurückgegeben (das heißt, verlassen). Wenn Sie dieses Verhalten nicht möchten, haben Sie nicht den Hauptthread-Exit.

+1

Ich würde hinzufügen, dass dies ein nomineller Zombie ist (ein "Zombie"?). Die Beendigung des Hauptthreads über 'pthread_exit', wenn andere Threads ausgeführt werden, erzeugt _nicht_ ein SIGCHLD und unterbricht auch keine wartenden Aufrufe im übergeordneten Element. Der Prozess ist mehr oder weniger nur aus der Perspektive von _ps (1) _ "stillgelegt". – pilcrow

+1

Nun, alle Threads werden vom Betriebssystem in diesem Sinne gestartet. 'pthread_exit()' sollte definitionsgemäß nur den aktuellen Thread beenden, genauso wie wenn er von einem anderen Thread aufgerufen wird. Es ist also durchaus vernünftig zu erwarten, dass sich der Haupt-Thread wie jeder andere Thread im Prozess verhält. Aber natürlich nicht. –

+0

Offensichtlich ist der Haupt-Thread * nicht * wie jeder andere Thread: Er muss * nicht von 'pthread_create()' erstellt werden und das Betriebssystem darf seine Beendigung als speziell behandeln. –

Verwandte Themen