c - 使用 CLOCK_REALTIME 的内核 4.X 的纳秒精度可变计时器

标签 c linux timer linux-kernel kernel

我已经研究计时器有一段时间了,但仍然无法为我的情况找到一个有希望的解决方案。

基本上,我想在特定时间发送数据包。 例如:

第一个数据包位于 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/

相关文章:

从 Lua 通过 Swig 调用 C 函数指针

c - linux加载器如何在libc.so加载之前调用malloc?

ios - 无法在 iOS 应用程序中使用 dispatch_source_t 在 GCD block 中运行计时器

c - 无约束内联汇编的引用变量

python - 尝试从Python3中的C函数获取数组

python - 从/proc/stat 计算 user、nice、sys、idle、iowait、irq 和 sirq

linux - 汇编 x86,在字符串中的每个单词后打印新行

c# - C# 控制台批处理应用程序中的最佳计时器方法

c# - Windows 服务中的计时器在一两天后停止触发,GC 或错误逻辑?

c - Florian 的 Grisu2 算法如何工作?