Книга: Разработка приложений в среде Linux. Второе издание

18.1.3. Ограничения, связанные со временем

18.1.3. Ограничения, связанные со временем

В 32-разрядных системах Linux, как и в большинстве систем Unix, переменная time_t является целым числом со знаком длиной 32 бита. Это означает, что в 10:14:07 вечера 18 января (четверг) 2038 года она переполнится. Поэтому время 10:14:08 вечера 18 января (четверг) 2038 года будет представлено как 3:45:52 вечера 13 декабря (пятница) 1901 года. Как видите, система Linux не проявляет "проблему 2000-го года" (поскольку используются собственные библиотеки времени), однако с ней связана "проблема 2038-го года".

На 64-разрядных платформах переменная time_t является соответственно 64-битовым числом со знаком. Это действительно эффективное решение, поскольку 64-битовое время со знаком можно назвать астрономическим.

Для того чтобы определить начальное время, текущее время, конечное время для используемой системы можно создать и запустить данную программу daytime.с.

 1: /* daytime.с */
 2:
 3: #include <stdio.h>
 4: #include <sys/time.h>
 5: #include <unistd.h>
 6:
 7: int main () {
 8:  struct timeval tv;
 9:  struct timezone tz;
10:  time_t now;
11:  /* beginning_of_time — это наименьшее значении, измеряемое time_t*/
12:  time_t beginning_of_time = 1L<<(sizeof(time_t)*8 - 1);
13:  /* end_of_time - это наибольшее значение, измеряемое time_t */
14:  time_t end_of_time = ~beginning_of_time;
15:
16:  printf("time_t имеет %d бит в длинуnn", sizeof(time_t) *8);
17:
18:  gettimeofday(&tv, &tz);
19:  now = tv.tv_sec;
20:  printf("Текущее время дня, представленное в виде структуры timeval:n"
21:   "tv.tv_sec = 0x%08x, tv.tv_usec = 0x%08хn"
22:   "tz.tz_minuteswest = 0x%08х, tz.tz_dsttime = 0x%08xnn",
23:   tv.tv_sec, tv.tv_usec, tz.tz_minuteswest, tz.tz_dsttime);
24:
25:  printf("Демонстрация ctime()%s:n",
26:   sizeof(time_t)*8 <= 32 ? "" :
27:   " (может зависнуть после печати первой строки; нажмите "
28:   "Control-C)") ;
29:  printf("текущее время: %s", ctime(&now));
30:  printf("начало времени: %s", ctime(&beginning_of_time));
31:  printf("конец времени: %s", ctime(&end_of_time));
32:
33:  exit(0);
34: }

К сожалению, функция ctime() является итеративной по своей природе. Это означает, что она (при любых практических целях) никогда не прерывает свою работу в 64-разрядных системах даже для астрономических дат (вроде 64-битового времени начала и завершения). Если вы устали ждать, когда же программа завершит свою работу, нажмите Control-C для ее завершения.

Оглавление книги


Генерация: 1.568. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз