nanosleep — high-resolution sleep
#include <time.h>
int
nanosleep( |
const struct timespec *req, |
struct timespec *rem) ; |
Note | |||
---|---|---|---|
|
nanosleep
() suspends the
execution of the calling thread until either at least the
time specified in *req
has elapsed, or the
delivery of a signal that triggers the invocation of a
handler in the calling thread or that terminates the
process.
If the call is interrupted by a signal handler,
nanosleep
() returns −1,
sets errno
to EINTR, and writes the remaining time into
the structure pointed to by rem
unless rem
is NULL. The value of
*rem
can then be used
to call nanosleep
() again and
complete the specified pause (but see NOTES).
The structure timespec is used to specify intervals of time with nanosecond precision. It is defined as follows:
struct timespec { time_t tv_sec
; /* seconds */long tv_nsec
; /* nanoseconds */};
The value of the nanoseconds field must be in the range 0 to 999999999.
Compared to sleep(3) and usleep(3), nanosleep
() has the following advantages:
it provides a higher resolution for specifying the sleep
interval; POSIX.1 explicitly specifies that it does not
interact with signals; and it makes the task of resuming a
sleep that has been interrupted by a signal handler
easier.
On successfully sleeping for the requested interval,
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.
Problem with copying information from user space.
The pause has been interrupted by a signal that was
delivered to the thread (see signal(7)). The
remaining sleep time has been written into *rem
so that the thread
can easily call nanosleep
() again and continue with
the pause.
The value in the tv_nsec
field was not in
the range 0 to 999999999 or tv_sec
was negative.
If the interval specified in req
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.
The fact that nanosleep
()
sleeps for a relative interval can be problematic if the call
is repeatedly restarted after being interrupted by signals,
since the time between the interruptions and restarts of the
call will lead to drift in the time when the sleep finally
completes. This problem can be avoided by using clock_nanosleep(2) with an
absolute time value.
POSIX.1 specifies that nanosleep
() should measure time against the
CLOCK_REALTIME
clock. However,
Linux measures the time using the CLOCK_MONOTONIC
clock. This probably does
not matter, since the POSIX.1 specification for clock_settime(2) says that
discontinuous changes in CLOCK_REALTIME
should not affect
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 thenanosleep
() function; ... Consequently, these time services shall expire when the requested relative interval elapses, independently of the new or old value of the clock.
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 ms 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 kernel 2.5.39, hence is still present in current
2.4 kernels, but not in 2.6 kernels.
In Linux 2.4, if nanosleep
()
is stopped by a signal (e.g., SIGTSTP
), then the call fails with the
error EINTR after the thread
is resumed by a SIGCONT
signal.
If the system call is subsequently restarted, then the time
that the thread spent in the stopped state is not
counted against the sleep
interval.
clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), usleep(3), time(7)
This page is part of release 4.07 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
Copyright (C) Markus Kuhn, 1996 and Copyright (C) Linux Foundation, 2008, written by Michael Kerrisk <mtk.manpagesgmail.com> %%%LICENSE_START(GPLv2+_DOC_FULL) This is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU General Public License's references to "object code" and "executables" are to be interpreted as the output of any document formatting or typesetting system, including intermediate and printed output. This manual is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this manual; if not, see <http://www.gnu.org/licenses/>. %%%LICENSE_END 1996-04-10 Markus Kuhn <mskuhncip.informatik.uni-erlangen.de> First version written Modified, 2004-10-24, aeb 2008-06-24, mtk Minor rewrites of some parts. NOTES: describe case where clock_nanosleep() can be preferable. NOTES: describe CLOCK_REALTIME versus CLOCK_NANOSLEEP Replace crufty discussion of HZ with a pointer to time(7). |