В системах Unix libfaketime является де-факто стандартным решением этой проблемы в программном обеспечении. Он выполняет своего рода операцию посредника между вашим приложением и системной временной библиотекой. Запросы передаются в систему, но ответы изменяются по мере необходимости. Он также изменяет результаты вызовов stat()
, поэтому время изменения файла & c. также изменены.
Настройки выполняются с помощью переменных среды, поэтому вам, возможно, придется узнать о них, если вы еще не знакомы с их работой.
libfaketime поддерживает относительные и абсолютные смещения, время останова и работы, а также ускорение или замедление. Я не знаю о том, чтобы бежать назад.
Обратите внимание, что текущая версия претендует на то, что секунды - это самое высокое разрешение времени, и передает доли секунды ответов в приложение без изменений. Таким образом, если вы замедляете время до половины скорости, программа с подсекундной скоростью, выполняющая очень быстрые вызовы по времени, будет воспринимать целую секунду дважды, а не один раз, занимая в два раза больше времени. Если часы остановлены, это означает, что приложение видит случайное время в течение выбранной секунды.
К сожалению, Github сегодня не работает, поэтому документы сейчас недоступны, но это, вероятно, будет исправлено в ближайшее время.
Редактировать:
С резервным копированием Github я попробовал это и обнаружил, что код для изменения скорости достаточно общий, чтобы он работал с отрицательными значениями или чем-то еще, принятым atof()
.
Однако стала очевидной другая проблема: для изменения скорости необходимо начало времени в дополнение к реальному текущему времени и желаемому смещению времени. Этот источник задается независимо для подпроцессов, поэтому (при работе в обратном направлении с номинальной скоростью), когда родительский процесс откатился на одну минуту, вновь порожденный подпроцесс будет видеть текущее время на две минуты позже, чем родительский процесс.