Личный кабинет    
Назад К началу Вперед Карта сайта Телефонные коды стран и городов Мира Анализатор тарифов Служб IP-Телефонии и Рейтинг

Разделы
Введение
Литература
Операторы
Оборудование
Анализатор
Сотрудничество
Печать карт
Новости
Опросник
Коды
Справка
Работа
Каталог
Хостинг
Личный кабинет

Реклама

Perl для IP-Телефонии (18 – Сигналы, часть 10)

предыдущая часть ««»» следующая часть

Следующий пример:

$seconds_left = alarm($seconds);

показывает то, что процессу должен быть передан сигнал alrm по истечении промежутка времени $seconds. Результат, возвращаемый функцией, представляет собой число секунд, оставшихся после предыдущей установки таймера. Это значение не равно нулю, если ожидание было прервано. Значение параметра, равное нулю, отменяет установку таймера.

Недостатком этого кода является то, что интерпретатор Perl автоматически пере­запускает продолжительные системные вызовы, включая оператор <>. Даже по исте­чении времени, установленного функцией alarm, вызов <> продолжает выполнять­ся, ожидая ввода данных пользователем с клавиатуры. Решение этой проблемы состоит в использовании оператора eval{} и локально­го обработчика ALRM для отмены операции чтения. Ниже показан общий принцип реализации этого решения.

print STDERR "type your passwotd: ";
my $password = eval {
    local $SIG{ALRM} = sub { die "timeout" };
    alarm (5);        
    return ;
}
alarm (0);
print STDERR "you timed out" if $@ =~ /timeout/;

Вместо размещения обработчика ALRM в главной части программы, он локализует­ся в блоке eval {}. Блок eval {}, как и прежде, предусматривает установку выдержки времени функции alarm, после чего выполняется попытка чтения из деск­риптора файла STDIN. Если оператор <> выполняет возврат до истечения выдержки времени, то из блока eval {} возвращается строка ввода и присваивается переменной $password.

Однако если установленный период времени истекает до выполнения ввода, активизируется обработчик ALRM и вызывает аварийное завершение работы с сообщением об ошибке “timeout”. Поскольку аварийное завершение происходит внутри блока eval {}, в результате оператор eval {} просто возвращает значение undef и устанавливает значение переменной $@ равным последнему сообщению об ошибке. Выполняется сопоставление переменной $@ с образцом для поиска сообщения о таймауте и, в случае его обнаружения, выводится предупреждающее сообщение.



2013-10-03 19:55:48

предыдущая часть ««»» следующая часть


ДОКУМЕНТАЦИЯ VoIP


НОВОСТИ СВЯЗИ


РЕКОМЕНДУЕМ

 
[ стандарты | обзор | оборудование | анализатор | коды | новости | карта | партнерам | Мы ВКонтаке ]
Запрещается копировать материалы сайта без уведомления авторов.
С вопросами и предложениями обращайтесь со страницы контактов
Copyright c 1999-2024 IPTop.Net
 
IP-Телефония, Интернет Телефония, Компьютерная телефония