2014-11-18 3 views
7

Почему Linux рассматривает процесс, основной поток которого завершил процесс зомби, и есть ли способ избежать этого?Процесс Zombie, хотя потоки все еще запущены

В коде ниже I:

  1. Создать процесс с одной основной нитью
  2. Создать новый отдельностоящий нить
  3. pthread_exit основного потока
  4. pthread_exit стороннего нить

До # 3, ps(1) показывает мой процесс как обычный про налог. Однако после №3 ps(1) показывает мой процесс как зомби (например, 2491 pts/0 00:00:00 thread-app <defunct>) , хотя он все еще имеет потоки.

Можно ли выйти из основной темы, но не заходить в состояние зомби?

Код:

#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

может быть, вы хотите 'ptherad_join()'? –

+0

Я хочу новую тему, которая будет жить дольше, чем исходная основная тема. И эта главная нить уничтожается правильно, без зомби. – likern

+0

, поэтому вы хотите отсоединить поток от средней нити, используя http://linux.die.net/man/3/pthread_detach :) – MimiEAM

ответ

4

Это известная проблема. A fix proposed некоторое время назад компанией Kaz не принимал Ulrich Drepper. Его комментарий по этому поводу:

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. 

читать почту цепь для более подробного обсуждения по этому вопросу здесь:

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

3

Операционная система-думает, что ваш процесс является зомби, так как основной поток, который был запущен в операционной системе, возвращается (т.е. вышел). Если вы не хотите этого поведения, тогда у вас нет выхода основного потока.

+1

Я бы добавил, что это номинальный зомби («номби»?). Прекращение основного потока через 'pthread_exit', когда выполняются другие потоки, не генерирует SIGCHLD и не прерывает любые вызовы' wait' в родительском. Этот процесс является «несуществующим» более или менее только с точки зрения _ps (1) _. – pilcrow

+1

Ну, все потоки запускаются операционной системой в этом смысле. 'pthread_exit()', по определению, должен выйти только из текущего потока, точно так же, как когда он вызывается из любого другого потока. Таким образом, вполне разумно ожидать, что основной поток будет вести себя так же, как и любой другой поток процесса. Но, конечно, это не так. –

+0

Очевидно, что основной поток * не * как любой другой поток: он * не * должен быть создан 'pthread_create()', и операционной системе разрешено рассматривать его завершение как специальное. –

Смежные вопросы