我已经在定时器上工作了一段时间,但仍然无法针对我的情况获得有希望的解决方案。
基本上,我想在特定时间发送数据包。
例如 :
第一组1486500720.000000000
->等待-> nanosleep(1000000000)
1486500721.000000000的第二个数据包
->等待-> nanosleep(1000000000)
1486500722.000000000的第三包
->等待-> nanosleep(1000000000)
1486500723.000000000的第4个数据包
它们之间的时间间隔恰好是1.000000000秒,但是当我发送数据包时,每次都花费不同的时间。
例如,对于第一个数据包,发送它需要0.005025045秒,然后启动nanosleep。
因此,我的第二个数据包是在486500721.005025045而不是1486500721.000000000发送的。
因此,每次我必须通过使用clockgettime(CLOCK_REALTIME)减去剩余的时间(包括getime命令开销的偏移量)来调整nanosleep值。
因为我必须在具有纳秒精度的循环中做到这一点(我知道这是不可能的,但是我希望它尽可能具体),所以我使用了简单的for循环。
我的问题是,有没有更好的方法可以更精确地做到这一点?我使用的是内核4.4,因此您是否知道适用于较新内核的任何方法,或者其他可能比我更精确的方法?
最佳答案
您应该使用clock_nanosleep
(允许绝对时间等待),而不是nanosleep
(仅使用相对时间)。但是,您无法获得所需的精度。如果时钟到期后仅返回到用户空间,则至少要花费几百纳秒(如果不是一千或更多)。而且,唤醒后发送数据包的延迟也无法预测。
充其量,您也许可以根据自己的目的调整唤醒时间,使其“足够接近”。