我想在信号量上等待20 mili-secound,如下所示,但是当我打印tv_sec和tv_nsec的值变得非常大时。
任何人都可以帮助理解以下代码。
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
{
//throw error
}
ts.tv_nsec += 20000000;
ts.tv_sec += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;
sem_timedwait(&semaphore, &ts)
答案 0 :(得分:1)
它应该很大。 clock_gettime(CLOCK_REALTIME,& ts)给出了自大纪元时间以来的刻度,并且您要添加到返回的值。
来自http://man7.org/linux/man-pages/man2/clock_gettime.2.html手册页。
所有实现都支持系统范围的实时时钟,由CLOCK_REALTIME标识。它的时间代表自纪元以来的秒和纳秒。当时间改变时,相对间隔的定时器不受影响,但绝对时间点的定时器会受到影响。
来自sem_timedwait(3) - Linux手册页
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
abs_timeout参数指向一个结构,该结构指定自纪元以来的秒和纳秒的绝对超时
答案 1 :(得分:0)
clock_gettime
检索当前"日期和时间"以特定格式timespec
结构上的操作正在更新此日期:当前日期+ 20ms(并尝试处理边框效果:如果nsec
"溢出"那么我们应该增加sec
):所以在ts
包含您的信号量的截止日期之后sem_post
或超时。