CLOCK_NANOSLEEP - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-04-11
名称
clock_nanosleep-具有指定时钟的高分辨率睡眠
语法
#包括
int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *request, struct timespec *remain);
与-lrt链接(仅适用于2.17之前的glibc版本)。
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
clock_nanosleep():
- _POSIX_C_SOURCE>= 200112L
说明
像nanosleep(2)一样,clock_nanosleep()允许调用线程以纳秒精度指定的时间间隔进行睡眠。它的不同之处在于允许调用者选择要测量睡眠间隔的时钟,并且允许将睡眠间隔指定为绝对值或相对值。
传递给此调用并由该调用返回的时间值是使用timespec结构指定的,其定义如下:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds [0 .. 999999999] */ };
clockid参数指定要用来测量睡眠间隔的时钟。此参数可以具有以下值之一:
- CLOCK_REALTIME
- 可设置的系统范围的实时时钟。
- CLOCK_TAI(since Linux 3.10)
- 从挂钟时间派生的系统范围时钟,但忽略leap秒。
- CLOCK_MONOTONIC
- 一个不可设置的,单调递增的时钟,用于测量从过去某个未指定的点开始的时间,该时间在系统启动后不会更改。
- CLOCK_BOOTIME(since Linux 2.6.39)
- 与CLOCK_MONOTONIC相同,除了它还包括系统挂起的任何时间。
- CLOCK_PROCESS_CPUTIME_ID
- 可设置的每个进程时钟,用于测量进程中所有线程消耗的CPU时间。
有关这些时钟的更多详细信息,请参见clock_getres(2)。另外,clock_getcpuclockid(3)和pthread_getcpuclockid(3)返回的CPU时钟ID也可以在clockid中传递。
如果flags为0,则将请求中指定的值解释为相对于clockid指定的时钟当前值的间隔。
如果标志是TIMER_ABSTIME,则将请求解释为由时钟clockid度量的绝对时间。如果请求小于或等于时钟的当前值,则clock_nanosleep()将立即返回,而不会挂起调用线程。
clock_nanosleep()暂停调用线程的执行,直到至少经过了请求指定的时间,或者传递了导致调用信号处理程序或终止进程的信号为止。
如果调用被信号处理程序中断,clock_nanosleep()将失败,并显示错误EINTR。另外,如果remain不为NULL,并且标志不是TIMER_ABSTIME,则返回remain中的剩余未睡眠时间。然后可以使用该值再次调用clock_nanosleep()并完成(相对)睡眠。
返回值
在请求的时间间隔内成功睡眠后,clock_nanosleep()返回0。如果调用被信号处理程序中断或遇到错误,则它将返回ERRORS中列出的正错误号之一。
错误说明
- EFAULT
- 请求或保留指定的无效地址。
- EINTR
- 睡眠被信号处理程序中断;参见signal(7)。
- EINVAL
- tv_nsec字段中的值不在0到999999999的范围内,或者tv_sec为负。
- EINVAL
- 时钟无效。 (CLOCK_THREAD_CPUTIME_ID不是Clockid的允许值。)
- ENOTSUP
- 内核不支持针对此时钟标识进行睡眠。
版本
clock_nanosleep()系统调用首先出现在Linux 2.6中。从2.1版开始,glibc就提供了支持。
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
如果请求中指定的间隔不是底层时钟的精确整数倍(请参见time(7)),则该间隔将舍入为下一个整数。此外,在睡眠完成之后,在CPU可以自由再次执行调用线程之前,仍可能会有延迟。
使用绝对计时器对于防止nanosleep(2)中描述的计时器漂移问题很有用。 (在试图重新启动被信号反复中断的相对睡眠的程序中,此类问题更加严重。)要执行避免这些问题的相对睡眠,请为所需的时钟调用clock_gettime(2),将所需的间隔添加到返回的时间中值,然后使用TIMER_ABSTIME标志调用clock_nanosleep()。
无论使用sigaction(2)SA_RESTART标志如何,clock_nanosleep()都不会在被信号处理程序中断后重新启动。
当标志为TIMER_ABSTIME时,剩余参数未使用,并且不必要。 (可以使用相同的请求参数重新启动绝对睡眠。)
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),restart_syscall(2),timer_create(2),sleep(3),usleep(3),time(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。