Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       nanosleep - остановка работы процесса с более точным указанием периода

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <time.h>

       int nanosleep(const struct timespec *duration,
                     struct timespec *_Nullable rem);

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

       nanosleep():
           _POSIX_C_SOURCE >= 199309L

ОПИСАНИЕ

       nanosleep()   suspends  the  execution  of the calling thread until either at least the time specified in
       *duration has elapsed, or the delivery of a signal that triggers the  invocation  of  a  handler  in  the
       calling thread or that terminates the process.

       Если  вызов  прерван  обработчиком  сигнала, то nanosleep() возвращает -1, устанавливает errno в значение
       EINTR и записывает оставшееся время в структуру, на которую указывает rem, если  значение  rem  не  равно
       NULL.  Значение  *rem можно использовать для повторения вызова nanosleep() и продления окончания ожидания
       интервала (но см. ЗАМЕЧАНИЯ).

       The timespec(3)  structure is used to specify intervals of time with nanosecond precision.

       The value of the nanoseconds field must be in the range [0, 999999999].

       По сравнению с sleep(3) и usleep(3), в nanosleep() есть  следующие  достоинства:  он  позволяет  задавать
       более  точные  интервалы  времени, в POSIX.1 явно определено то, что он не влияет на сигналы, и позволяет
       более лёгким способом возобновить паузу после прерывания сигналом.

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

       On successfully sleeping for the requested duration, nanosleep()  returns 0.  If the call is  interrupted
       by a signal handler or encounters an error, then it returns -1, with errno set to indicate the error.

ОШИБКИ

       EFAULT Проблема с копированием информации из пространства пользователя.

       EINTR  Пауза  была прервана сигналом, отправленным нити (смотрите signal(7)). Оставшееся время записано в
              *rem для того, чтобы нить могла вызвать nanosleep() снова для возобновления паузы.

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

ВЕРСИИ

       В POSIX.1 указано, что nanosleep() должен измерять время по часам CLOCK_REALTIME. Однако, в  Linux  время
       измеряется  с  помощью часов CLOCK_MONOTONIC. Это, скорее всего, не важно, так как в спецификации POSIX.1
       для clock_settime(2) указано, что быстро происходящие изменения в  CLOCK_REALTIME  не  должны  влиять  на
       nanosleep():

              Setting the value of the CLOCK_REALTIME clock via clock_settime(2) shall have no effect on threads
              that  are  blocked  waiting  for  a  relative  time  service  based upon this clock, including the
              nanosleep()  function; ...  Consequently, these time services  shall  expire  when  the  requested
              duration elapses, independently of the new or old value of the clock.

СТАНДАРТЫ

       POSIX.1-2008.

ИСТОРИЯ

       POSIX.1-2001.

       In  order  to  support  applications  requiring  much more precise pauses (e.g., in order to control some
       time-critical hardware), nanosleep()  would handle pauses of up to 2 milliseconds by  busy  waiting  with
       microsecond  precision  when  called  from a thread scheduled under a real-time policy like SCHED_FIFO or
       SCHED_RR.  This special extension was removed in Linux 2.5.39, and is thus not available in  Linux  2.6.0
       and later kernels.

ПРИМЕЧАНИЯ

       If  the  duration  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() вызывает приостановку на относительный интервал, может привести к проблемам,
       если вызов постоянно перезапускается после прерывания по сигналу, так  как  время  между  прерываниями  и
       перезапуском  вызова будет приводить к временному смещению полного завершения приостановки. Этой проблемы
       можно избежать, если использовать clock_nanosleep(2) с абсолютными величинами времени.

ОШИБКИ

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

       В  Linux  2.4,  если  nanosleep() останавливается по сигналу (например, SIGTSTP), то после того, как нить
       продолжит работу по сигналу SIGCONT, вызов завершится неудачно с  ошибкой  EINTR.  Если  системный  вызов
       после  этого  перезапускается, то время, которое нить провела в остановленном состоянии, не учитывается в
       интервале остановки. Эта проблема исправлена в Linux 2.6.0 и новее.

СМОТРИТЕ ТАКЖЕ

       clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2),  timer_create(2),  sleep(3),  timespec(3),
       usleep(3), time(7)

ПЕРЕВОД

       Русский  перевод этой страницы руководства разработал(и) Alex Nik <rage.iz.me@gmail.com>, Azamat Hackimov
       <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, 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 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                     nanosleep(2)