En sistemas unix, libfaketime es la solución estándar de facto para este problema en el software. Realiza una especie de operación man-in-the-middle entre su aplicación y la biblioteca de tiempos del sistema. Las solicitudes se pasan al sistema, pero las respuestas se modifican según sea necesario. También modifica los resultados de las stat()
llamadas, por lo que los tiempos de modificación de archivos, etc. También se modifican.
La configuración se realiza con variables de entorno, por lo que es posible que deba conocerlas si aún no está familiarizado con su funcionamiento.
libfaketime admite desplazamientos relativos y absolutos, paradas y tiempos de ejecución y aceleración o desaceleración. Sin embargo, no sé si correr hacia atrás.
Tenga en cuenta que la versión actual finge que los segundos son la resolución de tiempo más alta que existe y pasa partes de respuestas de menos de un segundo a la aplicación sin modificaciones. Por lo tanto, si reduce la velocidad del reloj a la mitad de la velocidad, un programa consciente de subsegundos que realiza llamadas de tiempo muy rápido experimentará todo el segundo dos veces uno tras otro en lugar de una sola, el doble de tiempo. Si el reloj se detiene, esto significa que la aplicación ve un tiempo aleatorio dentro del segundo seleccionado.
Desafortunadamente, Github está caído hoy, por lo que los documentos no están disponibles en este momento, pero eso probablemente se solucionará pronto.
Editar:
Con Github copia de seguridad lo probé, y encontré que el código para el cambio de velocidad es lo suficientemente general como para que funcione bien con valores negativos o cualquier otra cosa aceptada por atof()
.
Sin embargo, se hizo evidente un problema diferente: para el cambio de velocidad, es necesario un origen de tiempo además del tiempo actual real y el desplazamiento de tiempo deseado. Este origen se establece de forma independiente para los subprocesos, de modo que (cuando se ejecuta hacia atrás a velocidad nominal) cuando el proceso padre se ha retractado un minuto, un subproceso recién generado verá la hora actual dos minutos más tarde que el proceso padre.