我已经研究计时器有一段时间了,但仍然无法为我的情况找到一个有希望的解决方案。
基本上,我想在特定时间发送数据包。 例如:
第一个数据包位于 1486500720.000000000
->等待->nanosleep(1000000000)
第二个数据包位于 1486500721.000000000
->等待->nanosleep(1000000000)
第三个数据包位于 1486500722.000000000
->等待->nanosleep(1000000000)
第四个数据包位于 1486500723.000000000
它们之间的时间间隔正好是1.000000000秒,但是当我发送数据包时,每次都花费不同的时间。
例如,对于第一个数据包,发送它需要 0.005025045 秒,然后 nanosleep 开始。
因此,我的第二个数据包是在 486500721.005025045 而不是 1486500721.000000000 发送的。
因此,每次我都必须使用 Clockgettime(CLOCK_REALTIME) 减去剩余时间(包括 gettime 命令开销的偏移量)来调整 nanosleep 值。
由于我必须在纳秒精度的循环中执行此操作(我知道这是不可能的,但我希望它尽可能具体),因此我使用简单的 for 循环。
我的问题是有没有更好的方法可以更精确地做到这一点?我使用的是内核 4.4,那么您是否知道任何适用于较新内核的方法或任何其他可能比我的更精确的方法?
最佳答案
您应该使用clock_nanosleep
,它允许等待绝对时间,而不是nanosleep
,它只使用相对时间。然而,您无法获得您所要求的精确度。在时钟到期后返回用户空间至少需要几百纳秒(如果不是一千纳秒或更多)。然后,在您醒来后发送数据包也会出现不可预测的延迟。
您最多可以将您的唤醒时间调整为“足够接近”以达到您的目的。
关于c - 使用 CLOCK_REALTIME 的内核 4.X 的纳秒精度可变计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42097216/