首页 > 编程知识 正文

an alarm clock,Sleep Cycle alarm clock

时间:2023-05-04 04:22:59 阅读:215041 作者:4583

转载自 http://man7.org/linux/man-pages/man2/clock_nanosleep.2.html
保存备忘,方便查找,侵删。

CLOCK_NANOSLEEP(2)Linux程序员手册CLOCK_NANOSLEEP(2)
NAME
clock_nanosleep-具有指定时钟的高分辨率睡眠
大纲
#include <time.h>

INT clock_nanosleep(clockid_t clock_id ,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 一样,clock_nanosleep()允许调用线程以
纳秒精度指定的时间间隔进行睡眠。它的
不同之处在于允许调用者选择
要测量睡眠间隔的时钟,并且允许将睡眠间隔
指定为绝对值或相对值。

传递给此调用并由该调用返回的时间值是
使用timespec结构指定的,该结构定义如下:

struct timespec { time_t tv_sec; / *秒* / 长tv_nsec; / *纳秒[0 .. 999999999] * / };

所述clock_id参数指定针对其睡眠时钟
间隔将被测量。该参数可以具有 以下值之一:
CLOCK_REALTIME 可设置的系统范围的实时时钟。
CLOCK_MONOTONIC 一个不可设置的,单调递增的时钟,用于测量从
过去某个未指定的点开始的时间,该时间在系统启动后不会更改。
CLOCK_PROCESS_CPUTIME_ID 可设置的每个进程时钟,用于测量进程中所有线程消耗的CPU时间。

如果flags为0,则将request中指定的值解释为 相对于clock_id指定的时钟的当前值的间隔。 如果flags是TIMER_ABSTIME,那么request将被解释 为由时钟clock_id测量的绝对时间。 如果request小于或等于clock的当前值, 那么clock_nanosleep()将立即返回而不会挂起调用线程。 clock_nanosleep()暂停调用线程的执行,直到 至少经过了request指定的时间,或者 传递了 导致调用信号处理程序 或 终止进程的 信号为止。 如果调用被信号处理程序中断, clock_nanosleep()将失败,并显示错误EINTR。 另外,如果remain不为NULL,并且flags不是TIMER_ABSTIME, 它将返回剩余unslept时间 remains。然后可以使用该值再次调用clock_nanosleep() 并完成(相对)睡眠。

返回值
在请求的时间间隔内成功睡眠后,
clock_nanosleep()返回0。如果调用被信号
处理程序中断或遇到错误,则它将返回
ERRORS中列出的正错误号之一。
错误
EFAULT 请求或保持指定的无效地址。EINTR 睡眠被信号处理程序中断;参见signal(7)。EINVAL tv_nsec字段中的值不在0到
999999999 的范围内,或者tv_sec为负。EINVAL clock_id无效。(CLOCK_THREAD_CPUTIME_ID不是
用于允许值clock_id。)

版本
该clock_nanosleep()系统调用首次出现在Linux 2.6中。
从2.1版开始,glibc就提供了支持。
符合
POSIX.1-2001,POSIX.1-2008。
笔记
如果请求中指定的间隔不是
底层时钟的精确整数倍(请参见time(7)),则该间隔将
舍入为下一个整数。此外,在睡眠
完成之后,在CPU可以自由
再次执行调用线程之前,可能还会有一个延迟。

使用绝对计时器对于防止nanosleep() 中所述类型的计时器漂移问题很有用。 ( 在试图重新启动被信号反复中断的相对睡眠的程序中,此类问题更加严重。) 为避免这些问题,请为所需的时钟调用clock_gettime(), 将所需的间隔添加到返回的时间值,然后使用TIMER_ABSTIME标志调用clock_nanosleep()。

无论使用sigaction()SA_RESTART 标志如何,
clock_nanosleep()都不会在被信号处理程序中断后重新启动。
当标志是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),restart_syscall(2),timer_create(2),
sleep(3),usleep(3),time(7)
版权页
该页面是Linux 手册页项目5.04版的一部分。
可以在https://www.kernel.org/doc/man-pages/上找到
该项目的描述,有关错误报告的信息以及此页面的最新版本。Linux 2017年9月15日CLOCK_NANOSLEEP(2)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。