没有crontab的情况下,每天如何发送信号?

问题描述

上下文:

我正在重试系统上的嵌入式openwrt上进行HTTP请求和证书权限检查。

我们不信任我们的网络服务器,并希望每天在文件上重试GET HTTP,直到其下载。

我们还希望在准确的时间下载文件

在正常时间,该程序为:

  • 管理Led的状态和网络状态
  • 从消息队列接收消息以执行Web请求和网络管理
  • 它监视另外两个进程,一个可能会崩溃的蓝牙和一个Zigbee。
  • 当我们投入生产时,它可能还会做其他事情。

问题:

我想每天在C中编程一个信号以获得异步事件。所以我基本上想要不带crontabs的crontab。

我要使用的信号是IPC中使用的信号(我不知道在Linux上创建异步行为的其他方法):https://www.man7.org/linux/man-pages/man7/signal.7.html

我知道如何使用crontab,但是我更喜欢用C进行所有操作,因为这会使不使用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)触发某些操作,也可以在不同的时间触发多个操作...