Виснет на $sock->recv. Perl под Windows.

DenisPerm

New Member
27.06.2008
2
0
#1
Не работает вот такая конструкция:

eval{
local $SIG{ALRM} = sub { die "Net::NTP timed out geting NTP packet\n"; };
alarm($TIMEOUT);
$sock->recv($data,960) or die "recv() failed: $!\n";
alarm(0)
};

Если идет обращение к несуществующему хосту, то виснет на $sock->recv.
Если ответ от хоста есть, то все нормально.

В чем дело и как правильно это реализуется ?
 

DenisPerm

New Member
27.06.2008
2
0
#3
Нее. Винда точно XP.
Да и сама конструкция alarm работает.
Т. е. если $sock->recv заменить на sleep,
то alarm через TIMEOUT работает.

Виснет именно $sock->recv.

И я ХЗ что с этим делать.
Самый смех, что текст их модуля Net-NTP.
И модулю то 300 лет.
 
V

Vovochka

Гость
#4
Хех :)
Может вместо эвала попробовать в поток обернуть?
Хотя вряд ли оно того стоит.
 
V

Vovochka

Гость
#6
В том то и прикол. Этот хак (код) помогает избавиться от блокировки:
Код:
local $SIG{ALRM} = sub { die "Net::NTP timed out geting NTP packet\n"; };
Присваиваем обработчик для сигнала SIGALART
С этим обработчиком при получении сигнала программа должна "умереть", но так как этот участок кода завернут в eval, то просто мы выпадем из этого блока.
Код:
alarm($TIMEOUT);
Заказываем SIGALARM через $TIMEOUT сек.
Код:
$sock->recv($data,960) or die "recv() failed: $!\n";
Блокирующий вызов.
Код:
alarm(0);
Мы не выпали из блока, значит блокирующий вызов завершился. Отказываемся от заказа на SIGALARM
Вот такая вот ботва :)