How to make a process detect time zone change?

Mark Shroyer subscriber+freebsd at markshroyer.com
Wed Mar 17 05:30:44 UTC 2010


On 3/16/2010 11:23 AM, Peter Steele wrote:
> We have a system controlled through a Java GUI and one of the
> commands provided in the GUI is to change the date/time, including
> the time zone. When the time zone is changed the FreeBSD system
> immediately recognizes the change (that is, the date command from the
> command line shows the correct time and time zone). However, our
> running C apps do not recognize that a time zone change has occurred
> unless they are restarted. What's the proper way to inform an active
> process that a time zone change has occurred? I've tried tzset() and
> tzsetwall() but neither seem to do the trick. The only thing I've
> found that works is to restart the process, and that's not really a
> solution.

I think I have a solution.  First I tried the following code:

> #include <stdio.h>
> #include <time.h>
> #include <unistd.h>
>
> int main(int argc, char* argv[])
> {
>     time_t now;
>     struct tm localNow;
>
>     for (;;) {
>         time(&now);
>         tzsetwall();
>         localtime_r(&now, &localNow);
>         printf("%02d:%02d:%02d %s\n", localNow.tm_hour,
>                                       localNow.tm_min,
>                                       localNow.tm_sec,
>                                       localNow.tm_zone);
>         sleep(1);
>     }
>
>     return 0;
> }

While this was running I set /etc/localtime to a different time zone,
and sure enough, my process failed to pick up the new zone until I
killed and restarted it.  However, when I passed the environment
variable TZ=/etc/localtime to the program:

> $ env TZ=/etc/localtime ./a.out
> 06:11:30 MET
> 06:11:31 MET
> 06:11:32 MET
> 06:11:33 MET
> 01:11:34 EDT
> 01:11:35 EDT
> 01:11:36 EDT
> ^C$

So there it is: set TZ=/etc/localtime and use tzsetwall() to update the
time zone within the process.  In my reading, the tzsetwall(3)
documentation does seem to imply tzsetwall() would check /etc/localtime
even if TZ isn't set, but apparently this isn't the case; maybe the man
page could be clarified on this point?

Anyway, I hope this helps...

-- 
Mark Shroyer
http://markshroyer.com/contact/


More information about the freebsd-questions mailing list