gpt4 book ai didi

由 cron 运行时的 C sleep 方差

转载 作者:行者123 更新时间:2023-11-30 17:45:15 25 4
gpt4 key购买 nike

我编写了一些 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,而大多数其他进程的值都在 0 左右。将我的作业设置为较低的 Nice 值(需要 root 权限)会为其提供更高的优先级,并防止其暂停。

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

最佳答案

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

关于由 cron 运行时的 C sleep 方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com