clock_nanosleep(2)

НАИМЕНОВАНИЕ
clock_nanosleep - остановка работы процесса на точно выдержанное время с помощью определённых часов

БИБЛИОТЕКА
Стандартная библиотека C (libc, -lc), начиная с glibc 2.17

До glibc 2.17, библиотека реального времени (librt, -lrt)

ОБЗОР
#include <time.h>

int clock_nanosleep(clockid_t clockid, int flags,
                    const struct timespec *t,
                    struct timespec *_Nullable remain);

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

clock_nanosleep():
    _POSIX_C_SOURCE >= 200112L

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

Значения времени, передаваемые и возвращаемые этим вызовом, указываются с использованием структур timespec(3).

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

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

CLOCK_TAI (начиная с Linux 3.10)
    Системные часы, основанные на времени настенных часов, но учитывающие дополнительные секунды.

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

CLOCK_BOOTTIME (начиная с Linux 2.6.39)
    Идентично CLOCK_MONOTONIC, за исключением того, что он также включает любое время, когда система приостановлена.

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

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

If flags is 0, then the value specified in t is interpreted as an interval relative to the current value of the clock specified by clockid.

If flags is TIMER_ABSTIME, then t is interpreted as an absolute time as measured by the clock, clockid. If t is less than or equal to the current value of the clock, then clock_nanosleep() returns immediately without suspending the calling thread.

clock_nanosleep() suspends the execution of the calling thread until either at least the time specified by t has elapsed, or a signal is delivered that causes a signal handler to be called or that terminates the process.

Если вызов прерывается обработчиком сигнала, то clock_nanosleep() завершается с ошибкой EINTR. Также, если remain не равно NULL и flags не равно TIMER_ABSTIME, то он возвращает в remain остаток непроведённого в остановке времени. Это значение можно использовать в вызове clock_nanosleep() снова и завершить (относительно) приостановку.

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

ОШИБКИ

EFAULT
    t или remain указал неверный адрес.

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

EINVAL
    Значение в поле tv_nsec не находилось в диапазоне [0, 999999999] или tv_nsec было отрицательным.

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

ENOTSUP
    Ядро не поддерживает сон против этого clockid.

СТАНДАРТЫ
POSIX.1-2008.

ИСТОРИЯ
POSIX.1-2001. Linux 2.6, glibc 2.1.

ПРИМЕЧАНИЯ
If the interval specified in t is not an exact multiple of the granularity underlying clock (see time(7)), then the interval will be rounded up to the next multiple. Furthermore, after the sleep completes, there may still be a delay before the CPU becomes free to once again execute the calling thread.

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

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

The remain argument is unused, and unnecessary, when flags is TIMER_ABSTIME. (An absolute sleep can be restarted using the same t argument.)

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

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

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

СМОТРИТЕ ТАКЖЕ
clock_getres(2), nanosleep(2), restart_syscall(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).