CLOCK_NANOSLEEP - Linux手册页

时间:2019-08-20 17:58:36  来源:igfitidea点击:

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/