void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec) 用于将形参的sec和nsec分别赋值给timespec64的成员
变量,这里第三个形参nsec的范围应该在0 <= tv_nsec < NSEC_PER_SEC之内
其源码分析如下:
void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec)
{
#可以看到这里nsec表示的时间可以大于1s,会将大于1s的时间转成秒
while (nsec >= NSEC_PER_SEC) {
/*
* The following asm() prevents the compiler from
* optimising this loop into a modulo operation. See
* also __iter_div_u64_rem() in include/linux/time.h
*/
asm("" : "+rm"(nsec));
#注意这里做减法后可能导致nsec小于零,但是没有关系,后面的while 会处理小于零的case.
nsec -= NSEC_PER_SEC;
++sec;
}
#nsec 表示的时间也可以小于0,会让总的秒数减一,来补偿nsec让其不用小于零
while (nsec < 0) {
asm("" : "+rm"(nsec));
nsec += NSEC_PER_SEC;
--sec;
}
ts->tv_sec = sec;
ts->tv_nsec = nsec;
}
内核定时机制API之set_normalized_timespec64
最新推荐文章于 2023-03-16 15:20:18 发布