私がテストした 2 つのシステム (32 ビット Ubuntu 12.04 サーバーと 64 ビット Ubuntu 13.10 VM) では、time()によって指定されたエポックからの秒数がgettimeofday()のものと異なる場合があります。
具体的には、 を呼び出しtime()
た後に呼び出すgettimeofday()
のですが、 の戻り値が の戻り値よりtime()
も小さい場合があります。tv_sec
gettimeofday()
これは、クロックが新しい秒にロールオーバーした直後に発生するようです。
これにより、私のコードの一部で、time() と gettimeofday() の秒が交換可能であると予想されるバグが発生しました。
この問題を示すサンプル コード:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main()
{
time_t start = time(NULL);
int same = 0;
int different = 0;
int max_usec = 0;
while (1) {
time_t t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = time(NULL);
if (t < tv.tv_sec) {
different++;
if (tv.tv_usec > max_usec) {
max_usec = tv.tv_usec;
}
} else {
same++;
}
if (t > start + 5) {
break;
}
}
printf("Same: %i\n", same);
printf("Different: %i\n", different);
printf("Largest difference seen at %i\n", max_usec);
}
time() second を呼び出しており、その値がgettimeofday() の値よりも小さい場合にのみ文句を言うことに注意してください。
出力例:
Same: 33282836
Different: 177076
Largest difference seen at 5844
つまり、2 つの値は 3300 万回同じで、177,000 回異なっており、新しい秒の 5844 マイクロ秒以内で常に異なっていました。
これは既知の問題ですか? これは何が原因ですか?