alarmСинтаксисalarm SECONDS ОписаниеПРИМЕЧАНИЕ Следует иметь в виду, что на некоторых машинах из-за особенностей реализации таймера интервал времени может быть на единицу меньше, чем вы указываете. С помощью alarm вы можете установить только один таймер. Каждый последующий вызов отменяет действие предыдущего таймера, а для отмены действия таймера вообще вы можете передать в качестве аргумента 0. Значение, возвращаемое функцией, представляет собой временной интервал, «недосчитанный» предыдущим таймером. В тех случаях, когда точность отсчета задержки в одну секунду для вашего приложения оказывается недостаточной, вы можете использовать вызов syscall, c помощью которого можно получить доступ к процедуре settimer. Альтернативой может служить использование функции select. Не рекомендуется использовать одновременно вызовы alarm и sleep. Если вы планируете использовать alarm для формирования интервала тайм-аута системного вызова, потребуется использовать конструкцию eval — die. Вы не можете полагаться на сигнал, вызванный отказом в выполнении системного вызова за счет проверки равенства переменной $! значению ЕINTR, поскольку некоторые версии Perl самостоятельно устанавливают обработчики системных сигналов. А вот пара eval — die работает всегда! Пример: eval { local $SIG{ALRM} = sub { die "alarm\n" }; # \n обязательно! alarm $timeout; $nread = sysread SOCKET, $buffer, $size; alarm 0; }; die if $@ && $@ ne "alarm\n"; # передача ошибок дальше if ($@) { # тайм-аут } else { # все в порядке... }
|