由cron运行时的C睡眠变化

时间:2013-10-30 20:38:55

标签: c cron crontab raspberry-pi usleep

我写了一些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运行时,而不是在我从commandLine中调用它时。

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

更新1 :以下是程序中usleep-section的摘录

// 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权限)使其具有更高的优先级并防止它被暂停。 / p>

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

1 个答案:

答案 0 :(得分:0)

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