|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 09 Oct 2002 16:51:25 To : Igor S Chencov Subject : Re: alarm signal problem -------------------------------------------------------------------------------- Igor S Chencov wrote: > Alex Dedul <Alex.Dedul@f82.n450.z2.fidonet.org> wrote: > AD: Hi, All ! > > AD: Как сделать так, чтобы после отработки сигнала ALRM выполнение > AD: программы продолжилось с нужного мне места ? В примере выполнение > подвисает AD: после $socks->connect(), вызывается обработчик сигнала и после > него выполнение AD: продолжает висеть где-то в нутрях Net::SOCKS. Можно ли > сделать чтобы после AD: обработчика был переход на следующую строку, которая > if($socket) ? AD: Заранее спасибо. [[skip]] Попробуй так - $SIG{ALRM} > = sub { die "alarm\n" }; eval { alarm ($opt_timeout); . . . alarm(0); }; > > if ($@ && $@ ne "alarm\n") { > print "Unknow error $@" ; > } elsif ($@) { > print "TimeOut\n"; > } else { > print "Ok\n"; > } Подобными конструкциями необходимо пользоваться с крайней осторожностью. Есть много подводных камней. Я бы рекомендовал для таймаутов сокетных операций использовать только IO::Select в сочетании с fcntl(sock, F_SETFL, O_NONBLOCK); Самые явные подводные камни, это: 1. вложенные ALARM-ы. Делая { local $SIG{ALRM} = sub {...}; alarm(30); Net::SOCK->new(...); alarm(0); } Вы упускаете из вида то, что в Net::SOCK может быть собственный alarm и обработчик сигнала. А ОС не поддерживает множественные алармы. 2. Hереентерабельность многих библиотек и модулей. 3. Hеатомарность. Кроме состояний "сокет открыт - таймаута нет" и "сокет не открыт - таймаут" может случиться состояние "сокет открыт - таймаут". Потому как после открытия сокета alarm сбрасывается в 0 неатомарно. 4. Windows (и некоторые другие ОС) не поддерживают alarm. По моему достаточно для того, чтоб задуматься об отказе от использования alarm за исключением редких вырожденных случаев. Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6577d9418bc3.html, оценка из 5, голосов 10
|