|
There's also a surprising difference in behavior between tm = localtime() and localtime_r(..., &tm). The former is the "traditional" function which returns a pointer to a statically allocated, global "struct_tm". The latter is the thread-safe version receiving a pointer to a use-supplied "struct tm" as it's second argument. : do {
: t = time(NULL);
: localtime_r(&t, &tm);
: printf("The time is now %02d:%02d:%02d.\n",
: tm.tm_hour, tm.tm_min, tm.tm_sec);
: sleep(1);
: } while(--N);
with TZ set to Europe/Berlin, set to :/etc/localtime, or unset I never get a stat on anything. write(1, "The time is now 07:23:33.\n", 26The time is now 07:23:33. ) = 26
nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffd9e798470) = 0
write(1, "The time is now 07:23:34.\n", 26The time is now 07:23:34. ) = 26
nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffd9e798470) = 0
write(1, "The time is now 07:23:35.\n", 26The time is now 07:23:35. ) = 26
nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffd9e798470) = 0
If I change it to tm = localtime()... stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2335, ...}) = 0
write(1, "The time is now 07:30:56.\n", 26The time is now 07:30:56.) = 26
nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffc868c3010) = 0
One more reason to switch to the reentrant/thread-safe versions of those ugly library functions :-).Note, this is using glibc 2.24 under Arch. $ /lib/libc.so.6
GNU C Library (GNU libc) stable release version 2.24, by Roland McGrath et al.
(...)
Compiled by GNU CC version 6.1.1 20160802.
|