int nanosleep(const struct timespec *req, struct timespec *rem);
ОПИСАНИЕ
nanosleep
приостанавливает работу процесса как минимум на время, заданное параметром
*req.
Функция может вернуть управление процессу ранее, если процесс
получил определенный сигнал. В этом случае функция возвращает значение -1
(при этом значение errno
становится равным
EINTR)
и записывает оставшееся время в структуру, заданную
rem,
если
rem
не равен
NULL.
Значение структуры
*rem
можно использовать для того, чтобы завершить заданную паузу путем
повторного вызова
nanosleep.
В функции используется структура
timespec,
позволяющая задавать интервалы времени с точностью до наносекунды.
Эта структура описана в
<time.h>
и имеет следующую форму:
Значение поля наносекунд должно находиться в диапазоне от 0 до 999 999 999.
По сравнению с
sleep(3)
и
usleep(3)
nanosleep
не влияет на сигналы, стандартизирована в POSIX, позволяет задавать
более точные интервалы времени и позволяет более легким способом возобновить паузу
после прерывания ее сигналом.
При удачном завершении вызова возвращаемое значение равно нулю. При ошибке оно равно
-1, а переменной
errno
присваивается номер ошибки.
НАЙДЕННЫЕ ОШИБКИ
EINTR
Пауза была прервана неблокированым сигналом, отправленным процессу.
Оставшееся время записывается в структуру *rem для того,
чтобы позволить ему еще раз вызвать
nanosleep
для возобновления паузы.
EINVAL
Значение
tv_nsec
не находится в интервале от 0 до 999 999 999, или
tv_sec
- отрицательное число.
НАЙДЕННЫЕ ОШИБКИ
Текущая реализация
nanosleep
базируется на стандартном механизме таймера в ядре, имеющем разрешение
в 1/HZ c (т.е, 10 мс в Linux/i386 и 1 мс в Linux/Alpha).
Таким образом,
nanosleep
всегда задерживает исполнение процесса как минимум на заданное время,
однако задержка может длиться на 10 мс дольше заданной. По этой же причине
значение, возвращаемое в случае, если процесс получит сигнал, округляется
в большую сторону, до 1/HZ с.
Некоторым приложениям требуется задание более точных пауз
(например, для контроля за оборудованием, требующим точных временных
интервалов работы), поэтому
nanosleep
может выдерживать более точные паузы. Если процесс протекает
в реальном времени (режимы
SCHED_FIFO
или
SCHED_RR),
то паузы продолжительностью до 2 мс выдерживаются, как пустые циклы, с точностью
до микросекунд.