C 由 cron 运行时的睡眠方差



我写了一些C代码来打开和关闭一些LED。实际上,我想准确地触发它们到音乐,但还没有找到比在两者之间使用usleep()更好的方法。

无论如何,当我在命令行上调用程序时,打开 LED、等待 usleep() 并再次关闭 LED 非常准确。

现在我希望 cron 执行程序,比如说每五分钟一次。因此,我添加了以下带有crontab -e的cronjob:

*/5 * * * * bash ~/startShow.sh >~/log 2>&1

没有外壳脚本的相同问题。

*/5 * * * * ~/projects/startLEDShow >~/log 2>&1

startShow.sh

date
/usr/sbin/i2cset -y 1 0x40 0x00 0x21 # Preparation for communication via I2C
cd projects
./startLEDShow

该程序每五分钟触发一次,但在某个时刻(并不总是同一点),执行似乎停止片刻,大约一秒钟后恢复。这只是当程序由cron运行时,而不是当我从命令行调用它时。

为什么会这样,这可能是由于程序中使用的usleep(),我如何确保程序执行不会暂停一段时间?

更新1:这是程序的睡眠部分的摘录

// Start reading
while(NULL != (word = readToChar(fp, wordBuffer))) {
    // Values for the LEDs are stored in a struct
    updateValuesForLEDs(next, word); // Update struct "next"
    usleep(((next->time/timeFactor - lastTime)*1000000)); // Wait
    lastTime = next->time / timeFactor; // Set lastTime for next iteration
    setLEDs(i2cConnection, next, buffer); // Set the LEDs to the brightness values stored in struct "next" via I2C
}

更新 2:在ensc的评论之后,我找到了解决我的问题的方法。

cronjob 以一个不错的值 10 启动,而大多数其他进程的值都围绕 0 圈。将我的作业设置为较低的 nice 值(需要 root 权限)会为其提供更高的优先级并防止它被暂停。

00 20 * * * sudo nice -n -20 ~/projects/startLEDShow >~/log.txt 2>&1

我怀疑您运行的是实时操作系统,因此usleep不能保证唤醒您的进程并保证性能。 就此而言,即使您的进程在正确的时间被唤醒,内核也总是有可能中断它并在任意时间内执行其他操作。

相关内容

  • 没有找到相关文章

最新更新