|Matthew Garrett (mjg59) wrote,|
@ 2011-11-17 08:39 am UTC
|Entry tags:||advogato, fedora|
time_t wakeup_time = get_next_event_time(); time_t now = time(NULL); sleep(wakeup_time-now);
This works absolutely fine, except that sleep() ignores time spent with a suspended system. If you sleep(3600) and then immediately suspend for 45 minutes you'll wake up after 105 minutes, not 60. Which probably isn't what you want. If you want a timer that'll expire at a specific time (or immediately after resume if that time passed during suspend), use the POSIX timer family (timer_create, timer_settime and friends) with CLOCK_REALTIME. It's a signal-driven interface rather than a blocking one, so implementation may be a little more complicated, but it has the advantage of actually working.