Продолжим об исключениях в сигналах для функции sleep(), которая переходит в состояние ожидания на указанное число секунд или до тех пор, пока не будет получен какой-либо сигнал. Если параметр не указан, эта функция навсегда переводит программу в состояние ожидания. После того как функция sleep() возвращает управление, она возвращает число секунд, фактически проведенных в состоянии ожидания.
Еще одним исключением является версия функции select() с четырьмя параметрами, которая может применяться для перехода в состояние ожидания на указанное время до тех пор, пока один или несколько дескрипторов файлов из указанного набора не будут готовы для ввода-вывода. Данная функция может быть применена, например, для написания приложений автоматизации бизнес процессов предприятий , и других, где имеет место частая смена состояний.
Иногда автоматическое возобновление выполнения системного вызова является нежелательным. Например, рассмотрим приложение, которое выводит для пользователя приглашение ввести пароль и пытается прочитать ответ со стандартного устройства ввода. В этом приложении может потребоваться установить выдержку времени для выполнения этой операции чтения на тот случай, если пользователь отойдет на некоторое время и оставит терминал без присмотра. На первый взгляд, такое требование позволяет реализовать следующий фрагмент кода:
my $timed_out = 0; $SIG{ALRM} =sub { $timed_out = 1 }; print STDERR "type your password:"; alarm(5); my $password = <STDIN>; alarm (0); print STDERR "you timed out" if $timed_out;
Здесь для установки таймера применяется функция alarm(). По истечении установленного времени операционная система вырабатывает сигнал ALRM, который перехватывается обработчиком, устанавливающим значение глобальной переменной $timed_out равным истинному значению. В этом коде функция alarm() вызывается с выдержкой времени пять секунд, а затем со стандартного устройства ввода считывается строка. После выполнения чтения снова вызывается функция alarm() с параметром, равным нулю, что приводит к отключению таймера. Замысел этого кода состоит в том, что пользователю предоставляется пять секунд для ввода пароля. Если этого не будет сделано, истечет время, установленное функцией alarm, и остальная часть программы будет пропущена.