【发布时间】:2012-05-16 19:31:56
【问题描述】:
是否可以在 Linux 中使用标准 C++ 在系统时间到达指定日期/时间时获得通知(当然假设我的进程已启动)?
我可以将计时器设置为我需要等待的时间,但是如果用户更改系统时间会发生什么?系统可以通知我用户更改了系统时间来重置我的计时器吗?
【问题讨论】:
-
是的,在最近的内核中。这是一个编程问题,但它was asked earlier on SuperUser
是否可以在 Linux 中使用标准 C++ 在系统时间到达指定日期/时间时获得通知(当然假设我的进程已启动)?
我可以将计时器设置为我需要等待的时间,但是如果用户更改系统时间会发生什么?系统可以通知我用户更改了系统时间来重置我的计时器吗?
【问题讨论】:
当然,只需编写代码来做你想做的事。例如:您可以保留所有此类计时器的列表,它们应该被触发的日期/时间,以及它们发生时应该执行的代码。然后,您可以每隔一段时间检查一下时间,看看是否超过了您的任何计时器应该触发的时间。如果是这样,请解雇他们,将他们从列表中删除,然后继续您的业务。
【讨论】:
Linux 内核有这样的系统调用,尽管它们没有集成到 libc API 中。 您可以创建一个计时器,从内核获取它的文件描述符,然后对描述符执行 select 或 epoll 调用,以便在计时器触发时得到通知。
它的手册页:http://www.kernel.org/doc/man-pages/online/pages/man2/timerfd_create.2.html
【讨论】:
TFD_TIMER_ABSTIME 和CLOCK_REALTIME。
可以计算程序开始到事件发生的时间,调用
sleep (difftime-1);
然后你可以控制时间是否被重置,但这样你只能将时间更正到未来 - 如果时间被重置,你会跳过事件。
【讨论】:
sleep 方法不起作用 - 它要求您在 sleep 时间预测系统时间和单调时间之间的偏移量将在唤醒时间,这通常是不可能的。
查看“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
【讨论】: