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 指定的时钟的当前值的间隔。

如果 flagsTIMER_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

requestremain 指定了无效的地址。

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 标志。

flagsTIMER_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)

引用自

prctl(2), signal(7)