The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  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 | Индекс форумов | Темы | Пред. тема | След. тема




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

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