clock_nanosleep()

转载自 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值