10.8.1.1. Труднее, но с большим контролем: alarm()
SIGALARM
Основным строительным блоком является системный вызов alarm()
#include
unsigned int alarm(unsigned int seconds);
После того, как alarm()
seconds
секунд, ядро посылает процессу SIGALARM
. Действием по умолчанию является завершение процесса, но вы скорее всего вместо этого установите обработчик сигнала для SIGALARM
.Возвращаемое значение либо 0, либо, если был установлен предыдущий сигнальный интервал, число секунд, остающихся до его завершения. Однако, для процесса имеется лишь один такой сигнальный интервал; предыдущий отменяется, а новый помещается на его место.
Преимуществом здесь является то, что со своим установленным обработчиком вы можете делать при поступлении сигнала все, что хотите. Недостаток же в том, что приходится быть готовым к работе в нескольких контекстах: основном контексте и контексте обработчика сигнала.
10.8.1.2. Простой и легкий: sleep()
Более легкий способ ожидания истечения фиксированного промежутка времени заключается в использовании функции sleep()
#include
unsigned int sleep(unsigned int seconds);
Возвращаемое значение равно 0, если процесс проспал все отведенное время. В противном случае возвращается оставшееся для сна время. Это последнее значение может возникнуть в случае, если появился сигнал, пока процесс дремал.
ЗАМЕЧАНИЕ
. Функцияsleep()
часто реализуется через сочетание signal()
, alarm()
и pause()
. Такой подход делает опасным смешивание sleep()
с вашим собственным вызовом alarm()
(или расширенной функцией setitimer()
, описанной в разделе 14.3.3 «Интервальные таймеры setitimer()
и getitimer()
») Чтобы теперь узнать о функции nanosleep()
, см. раздел 14.3.4 «Более точные паузы: nanosleep()
».10.8.2. Сигналы, управляющие заданиями
Несколько сигналов используются для реализации
bg
для помещения его в фоновый режим, а иногда использовали fg
для перемещения фонового или остановленного задания на передний план.Секция 9.2.1 «Обзор управления заданиями» описывает в общем, как осуществляется управление заданиями. Данный раздел завершает обзор, описав сигналы управления заданиями. поскольку иногда может понадобиться перехватить их непосредственно:
SIGTSTP
Этот сигнал осуществляет «остановку терминала». Это сигнал, который ядро посылает процессу, когда пользователь за терминалом (или окном, эмулирующим терминал) набирает определенный ключ. Обычно это CTRL-Z, аналогично тому, как CTRL-C обычно посылает SIGINT
Действием по умолчанию для SIGTSTP
vi
или Emacs, которые переводят терминал в посимвольный режим. По получении SIGTSTP
, они должны восстановить терминал в его нормальный построчный режим, а затем приостановиться сами.SIGSTOP
Этот сигнал также останавливает процесс, но он не может быть перехвачен, заблокирован или проигнорирован. Он может быть использован в качестве последнего средства вручную (посредством команды kill
SIGTSTP
после восстановления состояния терминала мог бы затем использовать для остановки процесса 'raise (SIGSTOP)
'.SIGTTIN
SIGTTOU
Ранее эти сигналы были определены как «фоновое чтение из tty» и «фоновая запись в tty».
SIGCONT