18.2.1. Режим ожидания
18.2.1. Режим ожидания
Процесс, сопровождающийся запросом на невыполнение в течение определенного количества времени, называется отложенным (или "спящим"). Для режима ожидания доступны четыре функции; каждая из них измеряет время в различных единицах. Они также ведут себя и взаимодействуют с остальными частями системы по-разному.
unsigned int sleep(unsigned int seconds);
Функция sleep() вынуждает текущий процесс засыпать на время (в секундах), указанное параметром seconds, или до тех пор, пока процесс не получит сигнал, который он не может проигнорировать. На большинстве платформ функция sleep() реализуется в терминах сигнала SIGALRM, поэтому она не очень хорошо совмещается с системным вызовом alarm(), созданием обработчика SIGALRM, игнорированием сигнала SIGALRM, или применением интервальных таймеров (рассматриваются далее), которые разделяют один и тот же таймер и сигнал.
Если работа sleep() завершается раньше истечения полного выделенного времени, она возвращает количество оставшихся секунд. Если режим ожидания длился ровно столько, сколько запрашивалось, она возвращает ноль.
void usleep(unsigned long usec);
Функция usleep() вынуждает текущий процесс засыпать на время (в микросекундах), указанное параметром usec. Никакие сигналы не используются. На большинстве платформ usleep() реализуется с помощью select().
int select(0, NULL, NULL, NULL, struct timeval tv);
Функция select(), описанная в главе 13, предлагает мобильный способ откладывания процессов на точное количество времени. Просто введите в объект struct timeval минимальное время, которое нужно ожидать, и можете быть уверены — ни одно событие не произойдет.
int nanosleep(struct timespec *req, struct timespec *rem);
Функция nanosleep() вынуждает текущий процесс засыпать на время, указанное параметром req (описание объекта timespec можно найти в начале этой главы), пока процесс не получит сигнал. Если работа nanosleep() прекращается раньше из-за полученного сигнала, то она возвращает -1 и устанавливает для errno значение EINTR, а также, если rem не является NULL, то передает в переменную rem количество времени, оставшегося в периоде ожидания.
Функция nanosleep() наименее переносима из всех рассмотренных, поскольку она была определена как часть спецификации POSIX.1b реального времени (ранее она называлась POSIX.4), которая выполняется не во всех версиях Unix. Однако все новые реализации Unix поддерживают ее, так как функции POSIX.1b в настоящее время являются стандартной частью Single Unix Specification (Единая спецификация Unix).
Не все платформы, предусматривающие функцию nanosleep(), обеспечивают высокую точность, однако Linux, как и остальные операционные системы реального времени, стремится принимать короткие запросы на обработку с предельной точностью. Более подробную информацию о программировании в режиме реального времени можно найти в [12].