Ubuntu 12.04.3 LTSボックスで作業していると、プロセスの存続期間中にシステムのタイムゾーンが変更されると、 localtime() と localtime_r() の動作が異なることに気付きました: localtime() はタイムゾーンの変更をすぐに取得しますが、 localtime_r() は行いますそうではなく、プロセスの開始時のタイムゾーンに固執しているようです。これは予想される動作ですか?私はこれがカバーされているのを見たことがありません。
より正確には、次のコードを使用すると...
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
int main() {
while (1) {
time_t t = time(NULL);
struct tm *tm = localtime(&t);
printf("localtime:%02d/%02d/%02d-%02d:%02d:%02d\n",
tm->tm_mon + 1, tm->tm_mday, tm->tm_year + 1900,
tm->tm_hour, tm->tm_min, tm->tm_sec);
sleep(1);
}
return 0;
}
...そして...経由でタイムゾーンをUTCから変更します
# echo 'Europe/Berlin' > /etc/timezone
# sudo dpkg-reconfigure --frontend noninteractive tzdata
... 次に、コードは以下を生成します ...
localtime:10/04/2013-01:11:33
localtime:10/04/2013-01:11:34
localtime:10/04/2013-01:11:35
localtime:10/03/2013-23:11:36
localtime:10/03/2013-23:11:37
localtime:10/03/2013-23:11:38
...しかし、私が使用する場合:
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
int main() {
while (1) {
time_t t = time(NULL);
struct tm local_tm;
struct tm *tm = localtime_r(&t, &local_tm);
printf("localtime_r:%02d/%02d/%02d-%02d:%02d:%02d\n",
tm->tm_mon + 1, tm->tm_mday, tm->tm_year + 1900,
tm->tm_hour, tm->tm_min, tm->tm_sec);
sleep(1);
}
return 0;
}
...その後、同様のタイムゾーンの変更を行っても変更はありません:
localtime_r:10/04/2013-01:15:37
localtime_r:10/04/2013-01:15:38
localtime_r:10/04/2013-01:15:39
localtime_r:10/04/2013-01:15:40
localtime_r:10/04/2013-01:15:41
localtime_r:10/04/2013-01:15:42
更新: localtime_r() を呼び出す前に tzset() への呼び出しを追加すると、期待される動作が生成されます。それが仕様/マンページから明らかであるかどうか(以下の説明を参照)は、mentalhealth.stackexchange.comの質問です...