|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6577e070ec48.html, оценка из 5, голосов 10
|