The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

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

"waitpid блокируется с флагом WNOHANG"  +/
Сообщение от radium (ok) on 14-Мрт-10, 12:50 
Доброго времени суток!

Пытаюсь обрабатывать завершающиеся дочерние процессы путём вызова waitpid в обработчике
SIG_CHLD. Флаг WNOHANG должен обеспечивать неблокирование этого вызова, но по факту
waitpid блокируется если есть работающие дочерние процессы.

Вот тестовый скрипт:


#!/usr/bin/perl
print "Starting... (PID: $$)\n";

$SIG{CHLD} = \&OnSigChild;

$i = 0;
$is_parent = 1;
$delay = 5;
for ($i = 0; $i < 2; $i++)
{
  $pid = fork();
  defined $pid or die "Start fork() error\n";
  if ($pid)
  {
    #is parent
    print "\$i = $i. OK [$pid]\n";    
    $delay += 10;
  }
  else
  {
    #is child
    $is_parent = 0;
    print "I CHILD ($$) and sleep $delay seconds!\n";
    sleep $delay;
    last;
  }
}

if ($is_parent)
{
  print "Parent stopped.\n";  
  while(1)
  {    
    print "waiting ctrl-c... ".localtime(time)."\n";
    sleep 1;
  }
}
else
{  
  print "CHILD stopped.\n";
}

#-----------------------------------
sub OnSigChild
{
    print "[$$] SIG_CHLD! \n";
    while ((my $exited_pid = waitpid(-1, WNOHANG)) > 0)
    {        
        print "  -- processed $exited_pid... \n";        
    };
    $SIG{CHLD} = \&OnSigChild;
}
#------------------------------------

И его вывод:


Starting... (PID: 28405)
I CHILD (28406) and sleep 5 seconds!
$i = 0. OK [28406]
I CHILD (28407) and sleep 15 seconds!
$i = 1. OK [28407]
Parent stopped.
waiting ctrl-c... Sun Mar 14 12:30:20 2010
waiting ctrl-c... Sun Mar 14 12:30:21 2010
waiting ctrl-c... Sun Mar 14 12:30:22 2010
waiting ctrl-c... Sun Mar 14 12:30:23 2010
waiting ctrl-c... Sun Mar 14 12:30:24 2010
CHILD stopped.
[28405] SIG_CHLD!
  -- processed 28406...
CHILD stopped.
  -- processed 28407...
[28405] SIG_CHLD!
waiting ctrl-c... Sun Mar 14 12:30:35 2010
waiting ctrl-c... Sun Mar 14 12:30:36 2010

Т.е. после завершения первого процесса (28406) отрабатывает обработчик OnSigChild, который вычищает зомби, но блокируется на второй итерации while'а до тех пор, пока не
завершится второй процесс (28407). После этого выполнение цикла продолжается, очищается второй зомби и обработчик завершается. После этого он вызывается снова т.к. событие SIG_CHLD от второго процесса ещё необработано.

perl 5.10.0 @ Linux Debian Lenny 5.0.4 (2.6.26-2-686)

Вопрос: как сделать _неблокирующую_ обработку дочерних процессов?

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "waitpid блокируется с флагом WNOHANG"  +/
Сообщение от radium (ok) on 14-Мрт-10, 12:59 
Упс, забыл
use POSIX;

Вопрос снят :)
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

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


АКЦИЯ! ПОДПИШИСЬ на журнал Linux Format до 31 января 2012 года и выиграй СУПЕРПРИЗ!

Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

Каждый, кто оформит подписку, получает бонус- объёмные наклейки на системный блок и подарки: с одним из первых выпусков журнала в 2012 году- диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

Подробнее о проведении акции вы можете прочитать на странице сайта.


  Закладки на сайте
  Проследить за страницей
Created 1996-2012 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList