概述
转载自 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)
最后
以上就是活力铃铛为你收集整理的clock_nanosleep()的全部内容,希望文章能够帮你解决clock_nanosleep()所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复