问题描述
上下文:
我正在重试系统上的嵌入式openwrt上进行HTTP请求和证书权限检查。
我们不信任我们的网络服务器,并希望每天在文件上重试GET HTTP,直到其下载。
我们还希望在准确的时间下载文件。
在正常时间,该程序为:
问题:
我想每天在C中编程一个信号以获得异步事件。所以我基本上想要不带crontabs的crontab。
我要使用的信号是IPC中使用的信号(我不知道在Linux上创建异步行为的其他方法):https://www.man7.org/linux/man-pages/man7/signal.7.html
我知道如何使用crontab,但是我更喜欢用C进行所有操作,因为这会使不使用linux的同事的体系结构更简单。
-
据我所知crontab没有C api。
-
我在代码中使用了计时器,但它们似乎不适合这种用法:https://man7.org/linux/man-pages/man2/timer_create.2.html 应该可以从系统请求日期和时间,并创建一个计时器在每天的所需时间触发,但是我认为Linux上可能已经存在解决方案。类似于eventHour(小时,信号,处理程序)。
-
我没有系统https://linuxconfig.org/how-to-schedule-tasks-with-systemd-timers-in-linux
问题:在Linux上的C语言中,获取每日/定期信号的正确方法是什么?
非常感谢,
解决方法
我不知道在Linux上创建异步行为的其他方式
Linux本身似乎不支持与您想要的东西相似的任何东西。
要在特定时间执行某些操作,必须启动某些程序并在后台运行,直到执行该操作为止。如果该操作应循环执行,则该程序必须永久运行。
使用crontab
的优点是,即使cron
中有数百种不同的动作,后台也只运行一个程序(crontab
)。但是,一个程序(cron
)在后台永久运行。
systemd
也是如此。
如果您不想使用这样的工具,则您的程序必须在后台永久运行。
timer_create
如果您需要很高的精度(例如,少于一秒),则可以使用它。
如果您不需要高精度并且不想要cron
或类似的东西,我会做这样的事情:
seconds_per_day = 60*60*24;
next_time = time(NULL) + seconds_per_day;
while(1)
{
usleep(5000000);
if(time(NULL) >= next_time)
{
perform_action();
next_time += seconds_per_day;
}
}
在示例中,我使用usleep()
等待5秒。使用更长的时间(例如10秒)将减少后台运行的程序所消耗的CPU功耗-并使得触发操作的确切时间点更加不精确。
该示例仅每24小时触发一次动作。
但是,您可以使用相同的原理在某个时间(例如晚上11:30)触发某些操作,也可以在不同的时间触发多个操作...