Главная » 2017 » Ноябрь » 17 » man 2 clock_nanosleep
01:27
man 2 clock_nanosleep

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


clock_nanosleep - остановка работы процесса на точно выдержанное время с помощью
определённых часов



ОБЗОР


#include <time.h>

int clock_nanosleep(clockid_t clock_id, int flags,
const struct timespec *request,
struct timespec *remain);

Компонуется при указании параметра -lrt (только для glibc до версии 2.17).

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

clock_nanosleep():
_POSIX_C_SOURCE >= 200112L



ОПИСАНИЕ


Подобно nanosleep(2), clock_nanosleep() позволяет вызывающей нити приостановить
работу на некоторое время с наносекундной точностью. Отличие в том, что вызывающий
может выбрать часы, по которым будет отсчитываться интервал, что позволяет
задавать интервал абсолютным или относительным значением времени.

Время, передаваемое и возвращаемое этим вызовом, задаётся в структурах timespec,
определённых следующим образом:

struct timespec {
time_t tv_sec; /* секунды */
long tv_nsec; /* наносекунды [0 .. 999999999] */
};

Аргумент clock_id определяет часы, по которым отсчитывается интервал. Этот
аргумент может иметь следующие значения:

CLOCK_REALTIME Настраиваемые системные часы реального времени.

CLOCK_MONOTONIC Ненастраиваемые, постоянно идущие вперёд часы, которые отчитывают
время с некоторой неопределённой точки в прошлом, которая не
изменяется с момент запуска системы.

CLOCK_PROCESS_CPUTIME_ID
Настраиваемые для каждого процесса часы, измеряющие время ЦП,
затраченное всеми нитями процесса.

Подробней об этих часах смотрите в clock_getres(2). Также ID часов ЦП,
возвращаемый clock_getcpuclockid(3) и pthread_getcpuclockid(3), также может
передаваться в clock_id.

Если flags равно 0, то значение, указанное в request, считается относительным
интервалом от текущего значения часов, заданных в clock_id.

Если flags равно TIMER_ABSTIME, то значением request считается абсолютное время,
отсчитываемое часами, заданными в clock_id. Если request меньше или равно текущему
значению часов, то clock_nanosleep() немедленно завершает работу без приостановки
работы вызывающий нити.




ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ


После успешной приостановки на запрошенное время, clock_nanosleep() возвращает 0.
Если вызове был прерван обработчиком сигнала или произошла ошибка, то возвращается
один из положительных номеров ошибок, перечисленных в разделе ОШИБКИ.



ОШИБКИ


EFAULT В request или remain указан неправильный адрес.

EINTR Сон прерван обработчиком сигнала; смотрите signal(7).

EINVAL Значение поля tv_nsec не находится в интервале от 0 до 999999999 или tv_sec
содержит отрицательное число.

EINVAL Неверное значение clock_id. (Значение CLOCK_THREAD_CPUTIME_ID нельзя
указать в clock_id.)



ВЕРСИИ


Системный вызов clock_nanosleep() появился в Linux 2.6. Поддержка в glibc
появилась в версии 2.1.



СООТВЕТСТВИЕ СТАНДАРТАМ


POSIX.1-2001, POSIX.1-2008.



ЗАМЕЧАНИЯ


Если интервал, указанный в request, не кратен степени разрешения используемых
часов (см. time(7)), то интервал будет округлён до следующего кратного значения.
Также, после окончания интервала приостановки может возникнуть задержка перед тем,
как ЦП освободится снова для следующего выполнения вызывающей нити.

Использование абсолютного таймера позволяет избежать проблем с уходом часов,
которые описаны в nanosleep(2). (Такие проблемы ухудшаются, если программа
пытается перезапустить приостановку на относительный интервал после постоянно
прерывания сигналами.) Чтобы избежать этих проблем при использовании
относительного интервала, вызовите clock_gettime(2) с нужными часами, добавьте
нужный интервал к возвращённому значению времени и вызовите clock_nanosleep() с
флагом TIMER_ABSTIME.

clock_nanosleep() никогда не перезапускается после того, как прерван обработчиком
сигнала, независимо от значения флага SA_RESTART в sigaction(2).

Аргумент remain не нужен и не используется, если flags равно TIMER_ABSTIME.
(Приостановка с абсолютным значением может быть перезапущена с тем же значением
аргумента request.)

В POSIX.1 указано, что clock_nanosleep() не влияет на заданные обработчики
сигналов или сигнальные маски.

В POSIX.1 указано, что после изменения значения часов CLOCK_REALTIME с помощью
clock_settime(2), новое значение часов должно быть использовано для определения
времени, на которое была блокирована нить с помощью clock_nanosleep() с абсолютным
значением; если по новому значению часов интервал приостановки истёк, то вызов
clock_nanosleep() немедленно завершается.

В POSIX.1 указано, что изменение значения часов CLOCK_REALTIME с помощью
clock_settime(2) не оказывает влияние на нити, которые заблокированы с помощью

Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 495 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar