March 2011 Archives

  • alarm SECONDS
  • alarm

    Подготавливает сигнал SIGALRM, который будет передан текущему процессу по истечении указанного количества секунд. Если SECONDS не указано, используется значение из $_. (на некоторых машинах, к сожалению, прошедшее время может быть меньше или больше указанного на одну секунду, в зависимости от того, как считаются секунды. Из-за этого планировщик процессов может отложить доставку сигнала на некоторое время).

    Одновременно может быть активен только один таймер. Каждое новое обращение к функции отключает предыдущий таймер, таким образом, значение SECONDS, равное 0, может использоваться для отключения предыдущего таймера без запуска нового. Возвращаемое значение представляет остаток времени предыдущего таймера.

    Чтобы задать время подачи сигналов с большей точностью, чем одна секунда, можно применить функцию ualarm(), которую предоставляет модуль Time::HiRes (можно найти на CPAN, начиная с Perl 5.8 является частью дистрибутива). Также можно использовать 4х-аргументную версию select(), оставляя первые три аргумента неопределенными. Еще один вариант задать миллисекунды предоставляет интерфейс syscall для обращения к setitimer(2), если система поддерживает его. См. perlfaq8 подробнее.

    Обычно смешивание вызовов alarm и sleep является ошибкой, потому что в вашей системе функция sleep может быть внутренне реализована с использованием механизма системного вызова alarm(2).

    Если вы планируете использовать alarm для формирования тайм-аута системного вызова, необходимо использовать пару eval/die. Не стоит полагаться на то, что, в случае, если системный вызов не отработает должным образом, переменная $! будет содержать значение EINTR, поскольку на некоторых операционных системах, Perl устанавливает обработчики сигналов таким образом, чтобы они перезапускали системные вызовы. А вот связка eval/die работает всегда, возможные сложности описаны в perlipc.

        eval {
            local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n обязателен
            alarm $timeout;
            $nread = sysread SOCKET, $buffer, $size;
            alarm 0;
        };
        
        # если вышли по тайм-ауту $timeout
        if ($@) {
            die unless $@ eq "alarm\n";   # обработка неожиданных ошибок
        }
        # все в порядке, сработали пределах установленного времени $timeout
        else {
                #...
        }
    

    За более подробной информацией обратитесь к perlipc.


С небольшими изменениями взято отюда: translated.by
Прочие источники: http://valera.asf.ru/perl/help/
http://perl5doc.ru/en/f-alarm

Statistic

About this Archive

This page is an archive of entries from March 2011 listed from newest to oldest.

January 2011 is the previous archive.

May 2011 is the next archive.

Find recent content on the main index or look in the archives to find all content.