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