首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果没有crontab,我如何每天发送一个信号?

如果没有crontab,我如何每天发送一个信号?
EN

Stack Overflow用户
提问于 2020-09-01 15:01:59
回答 1查看 114关注 0票数 0

上下文:

我正在开发一个嵌入式openwrt,用于http请求和证书持久化检查的重试系统。

我们不信任我们的web服务器,并且希望每天重新尝试获取HTTP文件,直到它被下载为止。

我们还想在精确的时间下载文件。

在正常情况下,该方案是:

管理发光二极管状态和网络状态的administration

  • It
  • 从消息队列接收消息以执行web请求,网络
  • 监视另外两个进程--一个蓝牙和一个Zigbee --可能会崩溃。
  • 当我们进去时,它可能会做其他事情。

Problematic:

我想每天用C语言编写一个信号来获取异步事件。所以我基本上想要没有crontab的crontab。

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

我知道如何使用crontab,但是我更喜欢用C来做任何事情,因为它将使我的架构对于不使用linux的同事更简单。

据我所知,

  • 没有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语言获取日常/周期性信号的合适方法是什么?

非常感谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 16:45:53

我不知道在Linux上创建异步行为的其他方法

Linux本身似乎不支持任何与您想要的类似的东西。

若要在特定时间执行某些操作,必须启动某些程序并在后台运行,直到执行该操作为止。如果应循环执行该操作,则程序必须永久运行。

使用crontab的优点是,即使您的crontab中有数百个不同的操作,也只有一个程序(cron)正在后台运行。但是,有一个程序(cron)在后台永久运行。

systemd也是如此。

如果您不想使用这样的工具,您的程序必须永久地在后台运行。

timer_create

如果您需要相当高的精度(例如,不到1秒),则可以使用此方法。

如果您不需要很高的精度,并且不需要cron或类似的,我会这样做:

代码语言:javascript
复制
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)触发某些操作,或者在不同的时间触发多个操作.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63690324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档