【问题标题】:Is it possible in C/C++ in Linux to get informed when a specified date/time is reached?Linux 中的 C/C++ 是否可以在到达指定的日期/时间时获得通知?
【发布时间】:2012-05-16 19:31:56
【问题描述】:

是否可以在 Linux 中使用标准 C++ 在系统时间到达指定日期/时间时获得通知(当然假设我的进程已启动)?

我可以将计时器设置为我需要等待的时间,但是如果用户更改系统时间会发生什么?系统可以通知我用户更改了系统时间来重置我的计时器吗?

【问题讨论】:

标签: c++ c linux timer


【解决方案1】:

当然,只需编写代码来做你想做的事。例如:您可以保留所有此类计时器的列表,它们应该被触发的日期/时间,以及它们发生时应该执行的代码。然后,您可以每隔一段时间检查一下时间,看看是否超过了您的任何计时器应该触发的时间。如果是这样,请解雇他们,将他们从列表中删除,然后继续您的业务。

【讨论】:

  • 所以无法得到系统的通知?如果计时器已过期,我必须每秒检查一次(我需要 1 秒的分辨率)?
  • 您不一定非要那样做,但这是最简单的方法。而且它给系统带来的负载不到 0.001%,所以尝试优化它是愚蠢的。
  • 这是一个明显的负载。事实上,它对 CPU 缓存施加了更多压力,这意味着编写草率的应用程序会使整个系统变慢。
  • 这不是“草率地写”,而是经过深思熟虑的设计决定。同样,负载确实在 0.001% 左右,它使代码更加简单和便携。如果您知道更好的解决方案,...
  • 我总是尽量避免轮询作为原则,无论如何这是一个可能的解决方案。对我来说开发也很简单,经济上也很方便。
【解决方案2】:

Linux 内核有这样的系统调用,尽管它们没有集成到 libc API 中。 您可以创建一个计时器,从内核获取它的文件描述符,然后对描述符执行 select 或 epoll 调用,以便在计时器触发时得到通知。

它的手册页:http://www.kernel.org/doc/man-pages/online/pages/man2/timerfd_create.2.html

【讨论】:

  • 您可以指定适当的超时时间来选择/轮询。
  • 这是一个间隔计时器(自创建以来的秒数),与日期/时间无关(自指定日期的午夜以来的秒数0。
  • @MaximYegorushkin 唯一合适的超时时间是一秒。除此之外,如果系统时间向前跳跃,您将延迟开火。
  • 是的,timerfd API 确实提供了绝对定时器 (TFD_TIMER_ABSTIME)。此外,自 2009 年发布的 glibc 2.8(如链接手册页中所述)以来提供库支持,因此所有当前发行版都可能支持 timerfd。
  • timerfd 方法应该可以工作。使用TFD_TIMER_ABSTIMECLOCK_REALTIME
【解决方案3】:

可以计算程序开始到事件发生的时间,调用

sleep (difftime-1); 

然后你可以控制时间是否被重置,但这样你只能将时间更正到未来 - 如果时间被重置,你会跳过事件。

【讨论】:

  • 好的,那么关键是我是否可以让用户重置系统时间的回调。
  • A proposal 用于报告用户空间的时间变化已经流行了几年。 sleep 方法不起作用 - 它要求您在 sleep 时间预测系统时间和单调时间之间的偏移量将在唤醒时间,这通常是不可能的。
  • 但是一般情况下,用户在警报点过去后重新设置时间的可能性是无法避免的。我将 12:00 的闹钟设置为 16:00,并在 15:00 将时钟设置为 17:00。以秒为间隔观察时钟是无法避免的。不过我会说的。
【解决方案4】:

查看“at”命令的文档(man at)

例如,at 可以在给定时间(例如下午 2:35)向您发送电子邮件。

at 14:35
warning: commands will be executed using /bin/sh
at> mail -s "It is 2:35 PM" dbadmin < /dev/null
at><EOT> # After CTRL/D pressed.
job 9 at Tue May  8 14:35:00 2012

【讨论】:

  • 这如何帮助 C/C++ 程序检测何时到达该时间?
  • 您可以指定要在特定时间实例调用的程序名称 (exe),并且在该可执行文件中,您将能够发送可以在主程序中处理/兑现的信号(或事件) c/c++程序。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 2017-12-27
  • 2021-05-02
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多