clock_nanosleep(2) - Linux 手册页
名称
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():
- _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
描述
与 nanosleep(2) 类似,clock_nanosleep() 允许调用线程以纳秒精度指定的时间间隔休眠。它不同之处在于允许调用者选择用于测量睡眠间隔的时钟,以及允许将睡眠间隔指定为绝对值或相对值。
传递给此调用的以及由其返回的时间值使用以下定义的 timespec 结构指定
-
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds [0 .. 999999999] */ }; - clock_id 参数指定用于测量睡眠间隔的时钟。此参数可以具有以下值之一
- CLOCK_REALTIME
一个可设置的系统范围内的实时时钟。
CLOCK_MONOTONIC
一个不可设置的、单调递增的时钟,它测量自过去某个不确定的时间点以来经过的时间,该时间点在系统启动后不会更改。
- CLOCK_PROCESS_CPUTIME_ID
一个可设置的、按进程的时钟,它测量进程中所有线程消耗的 CPU 时间。
- 有关这些时钟的更多详细信息,请参阅 clock_getres(2)。
如果 flags 为 0,则 request 中指定的值被解释为相对于由 clock_id 指定的时钟的当前值的间隔。
如果 flags 是 TIMER_ABSTIME,则 request 被解释为由时钟 clock_id 测量的绝对时间。如果 request 小于或等于时钟的当前值,则 clock_nanosleep() 会立即返回,而不会挂起调用线程。
clock_nanosleep() 暂停调用线程的执行,直到至少经过 request 指定的时间,或者传递一个信号导致调用信号处理程序或终止进程。
如果调用被信号处理程序中断,clock_nanosleep() 将以错误 EINTR 失败。此外,如果 remain 不为 NULL,并且 flags 不是 TIMER_ABSTIME,则它会将剩余未睡眠的时间返回到 remain 中。然后可以使用该值再次调用 clock_nanosleep() 并完成(相对)睡眠。
返回值
成功睡眠请求的间隔后,clock_nanosleep() 返回 0。如果调用被信号处理程序中断或遇到错误,则它将返回 ERRORS 中列出的一个正错误号。
错误
- EFAULT
request 或 remain 指定了无效的地址。
EINTR
睡眠被信号处理程序中断。
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。
说明
如果 request 中指定的间隔不是底层时钟的精确倍数(请参阅 time(7)),则该间隔将被向上舍入到下一个倍数。此外,在睡眠完成后,在 CPU 再次可以执行调用线程之前,可能仍然存在延迟。
使用绝对定时器对于防止 nanosleep(2) 中描述的定时器漂移问题很有用。(这些问题在尝试重复中断并由信号重启的相对睡眠的程序中会加剧。)要执行避免这些问题的相对睡眠,请为所需时钟调用 clock_gettime(2),将所需间隔添加到返回的时间值,然后使用 TIMER_ABSTIME 标志调用 clock_nanosleep()。
clock_nanosleep() 不会在被信号处理程序中断后重新启动,无论是否使用 sigaction(2) SA_RESTART 标志。
当 flags 是 TIMER_ABSTIME 时,remain 参数未使用且不必要。(可以使用相同的 request 参数重启绝对睡眠。)
POSIX.1 规定 clock_nanosleep() 不会影响信号处理或信号屏蔽。
POSIX.1 规定,通过 clock_settime(2) 更改 CLOCK_REALTIME 时钟的值后,新的时钟值将用于确定阻塞在绝对 clock_nanosleep() 上的线程将唤醒的时间;如果新的时钟值落在睡眠间隔的末尾之后,则 clock_nanosleep() 调用将立即返回。
POSIX.1 规定,通过 clock_settime(2) 更改 CLOCK_REALTIME 时钟的值对阻塞在相对 clock_nanosleep() 上的线程没有影响。
参见
clock_getres(2), nanosleep(2), timer_create(2), sleep(3), usleep(3), time(7)