The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Процессы-зомби"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Процессы-зомби"
Сообщение от ToGraiL emailИскать по авторуВ закладки(ok) on 03-Авг-04, 15:11  (MSK)
У меня в наличии типичный сервер. Для каждого нового соединения я создаю новый процесс. Для предотвращения создания кучи процессов-зомби (process_name<defunct>) я создаю обработчик сигнала SIGCHILD, в котором я вызываю функцию wait(). Вобщем такая ситуация работает, но всё же иногда в системе такие процессы-зомби создаются. При этом каждый новый процесс(тот который обслуживает соединение) завершает предыдущий процесс-зомби, но становится зомбёй сам. Как обычно решается подобная ситуация?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Процессы-зомби"
Сообщение от squirL Искать по авторуВ закладки(ok) on 03-Авг-04, 17:04  (MSK)
>У меня в наличии типичный сервер. Для каждого нового соединения я создаю новый процесс. Для предотвращения создания кучи процессов-зомби (process_name<defunct>) я создаю обработчик сигнала SIGCHILD, в котором я вызываю функцию wait(). Вобщем такая ситуация работает, но всё же иногда в системе такие процессы-зомби создаются. При этом каждый новый процесс(тот который обслуживает соединение) завершает предыдущий процесс-зомби, но становится зомбёй сам. Как обычно решается подобная ситуация?

код в студию... :) чтобы не гадали люди приведи тот участок где у тебя разветвляются потомок и родитель. потому как я когда то писал подобную прогу-сервер. и не помню, чтобы юзал SIGCHILD

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Процессы-зомби"
Сообщение от ToGraiL emailИскать по авторуВ закладки(ok) on 03-Авг-04, 18:07  (MSK)
bsock = accept(zfdp_listen_socket,(struct sockaddr * &addr,&size);
     if(bsock > 0)
     {
      
      struct sigaction sigch_act;
      memset(&sigch_act,0,sizeof(sigch_act));
      sigch_act.sa_handler = &clean_up_child_process;
      sigaction(SIGCHLD,&sigch_act,NULL);

      switch(pid=fork())
      {
          case  0 :
           close(zfdp_listen_socket) ;
           some_connection(bsock);
           close(bsock) ;
          return(0) ;
          case -1 : printf("Can't fork new process.\n") ;
             break ;
      }
      close(bsock) ;

>>>
>>>
>>>

void clean_up_child_process(int signal_number)
{
  int status;
  wait(&status);
}
            
            
    

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Процессы-зомби"
Сообщение от Soldier Искать по авторуВ закладки(??) on 03-Авг-04, 19:20  (MSK)
>  wait(&status);

Попробуйте заменить на

while (wait(&status)>0);

Если код возврата дочернего процесса не нужен, то можно просто игнорировать сигнал SIGCHLD:

signal(SIGCHLD,SIG_IGN);
(sigch_act.sa_handler=SIG_IGN)

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру