Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Alexey Surkov                        2:5020/400     01 May 2004  19:40:38
 To : All
 Subject : wait
 -------------------------------------------------------------------------------- 
 
 socket($s, PF_INET, SOCK_STREAM, getprotobyname 'tcp')
 socketpair($C, $P, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
 # обработку ошибок не привожу.
  my $pid = fork;
  unless(defined $pid)
  { close $C;
   close $P;
   close $s;
 
   L "fork: $!";
 
   $$c{w} = time + $o{errwait};
   return;
  }
 
  binmode $C;
  binmode $P;
  binmode $s;
 
  unless($pid)
  { close $C;
 
   if(connect $s, sockaddr_in($p, inet_aton $a))
   {my $v = '';
    vec($v, fileno $P, 1) = 1;
    vec($v, fileno $s, 1) = 1;
    for(;;)
    { next unless select my $r = $v, undef, my $e = $v, 1.0;
 
     last if vec($e, fileno $P, 1);
     last if vec($e, fileno $s, 1);
     my $t = '';
     if(vec $r, fileno $P, 1)
     { last unless defined recv $P, $t, 1024, 0;
      last unless length $t;
      last unless defined send $s, $t, 0;
     }
     if(vec $r, fileno $s, 1)
     { last unless defined recv $s, $t, 1024, 0;
      last unless length $t;
      last unless defined send $P, $t, 0;
     }
    }
   }
   close $s;
   close $P;
   exit;
  }
  close $P;
 
 Смысл всего этого - асинхронный connect под виндовс. Теперь можно просто
 читать и писать в $C (правда пропадает возможность узнать обломилмсь мы
 на connect или на передаче данных, но мне это и не надо). Прибивается
 child закрытием $C.
 
 Если не вызывать wait или waitpid - кончаются хэндлы. Значит вызывать
 надо. Hо почему-то на waitpid код может повисать. Пока делаю так:
 
 # здесь закрывается $C
 
 if(defined $$c{pid})
  { $SIG{ALRM} = sub { print 'ALRM'; die };
   alarm 5;
   eval 'waitpid $$c{pid}, 0; alarm 0';
   delete $$c{pid};
  }
 
 В итоге на waitpid висим не более 5 сек. Зависания почему-то идут
 сериями по несколько штук.
 
 Вопрос - почему виснет и как от этого избавиться?
 --- ifmail v.2.15dev5.3
  * Origin: If you haven't heard about it, you don't need it (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 wait   Alexey Surkov   01 May 2004 19:40:38 
Архивное /ru.perl/6577e070ec48.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional