上下文:
我正在开发一个嵌入式openwrt,用于http请求和证书持久化检查的重试系统。
我们不信任我们的web服务器,并且希望每天重新尝试获取HTTP文件,直到它被下载为止。
我们还想在精确的时间下载文件。
在正常情况下,该方案是:
管理发光二极管状态和网络状态的administration
Problematic:
我想每天用C语言编写一个信号来获取异步事件。所以我基本上想要没有crontab的crontab。
我想要使用的信号是IPC中使用的信号(我不知道在linux上创建异步行为的其他方法):https://www.man7.org/linux/man-pages/man7/signal.7.html
我知道如何使用crontab,但是我更喜欢用C来做任何事情,因为它将使我的架构对于不使用linux的同事更简单。
据我所知,
我没有https://linuxconfig.org/how-to-schedule-tasks-with-systemd-timers-in-linux系统
问题::在Linux上用C语言获取日常/周期性信号的合适方法是什么?
非常感谢,
发布于 2020-09-01 16:45:53
我不知道在Linux上创建异步行为的其他方法
Linux本身似乎不支持任何与您想要的类似的东西。
若要在特定时间执行某些操作,必须启动某些程序并在后台运行,直到执行该操作为止。如果应循环执行该操作,则程序必须永久运行。
使用crontab的优点是,即使您的crontab中有数百个不同的操作,也只有一个程序(cron)正在后台运行。但是,有一个程序(cron)在后台永久运行。
systemd也是如此。
如果您不想使用这样的工具,您的程序必须永久地在后台运行。
timer_create
如果您需要相当高的精度(例如,不到1秒),则可以使用此方法。
如果您不需要很高的精度,并且不需要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)触发某些操作,或者在不同的时间触发多个操作.
https://stackoverflow.com/questions/63690324
复制相似问题