Как правильно обрабатывать время в коде C для 32-разрядной встроенной Linux (ARMLinux), чтобы гарантировать, что код продолжает работать правильно после 03:14:07 UTC 19 января 2038 года (когда подписанный 32-разрядный time_t
переполняется) ? Учитывая, что time_t
имеет 32-разрядную подпись в системе, которую я должен использовать, какие есть альтернативы?
Значительное количество поисков в Google не выявило ничего практического. Кажется, все предполагают, что к тому времени мы все будем использовать 64-битные ОС, но это явно не так для встраиваемых систем.
В системе, которую я должен использовать, __kernel_time_t
определяется как long
. Что, по-видимому, означает, что для 64-битного времени нет ядра. Версия uClibc 0.9.29.
Я не могу поверить, что я единственный с этой проблемой, и я не хочу изобретать велосипед.
if (timeout_time <= current_time) handle_timeout();
Для всех подобных вещей следует использовать монотонные часы, а неtime()
илиgettimeofday()
или что-то в этом роде. Конечно, монотонные часы тоже могут зацикливаться, если вы не перезагрузитесь. И, конечно же, сбрасывать эпоху очень некрасиво и может сломать систему. Хотел бы я иметь серебряную пулю, но ее нет. - person n. 1.8e9-where's-my-share m.   schedule 26.01.2016time_t
дляtv_sec
, а также иногда (но не всегда) просто основана на обычном времени, но без корректировок. Ваш лучший выбор — монотонные часы, которые возвращают время безотказной работы (популярный выбор), но многие системы отслеживают время безотказной работы только как смещение от времени настенных часов (что довольно отстало), что может снова привести к проблемам с time_t. - person Art   schedule 26.01.2016