【问题标题】:C sleep variance when ran by cron由 cron 运行时的 C 睡眠方差
【发布时间】:2013-10-30 20:38:55
【问题描述】:

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

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

现在我想让 cron 执行程序,假设每五分钟执行一次。因此我用crontab -e添加了以下cronjob:

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

没有 shell 脚本也会出现同样的问题。

*/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:这是程序中的 usleep 部分的摘录

// 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 的 nice 值启动,而大多数其他进程的值都围绕 0 圈定。将我的作业设置为较低的 nice 值(需要 root 权限)赋予它更高的优先级并防止它被暂停。

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

【问题讨论】:

  • 如果不了解更多背景信息,我们不太可能为您提供帮助。您能在此处发布您的实际代码吗 - 包含usleep() 的代码?
  • 为什么要用 cron 循环呢?程序的运行时间是多少?为什么不while(1) 和睡眠(5 分钟 - 当前运行时间)?
  • @Macattack:那五分钟的循环只是 cronjob 和测试目的的示例。目的是每天在特定时间运行程序。
  • @Christian Ternus 将代码摘录添加到描述中。
  • cronjobs 通常运行的优先级较低(更高的 nice 级别);并行 io(例如,由于记录执行 cronjob,耗尽 io 缓冲区)可能会延迟内部延迟。

标签: c cron crontab raspberry-pi usleep


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-05-11
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多