Sui sistemi unix, libfaketime è di fatto la soluzione standard per questo problema nel software. Esegue una sorta di operazione man-in-the-middle tra l'applicazione e la libreria temporale del sistema. Le richieste vengono passate al sistema, ma le risposte vengono modificate secondo necessità. Modifica anche i risultati delle stat()
chiamate, quindi i tempi di modifica dei file ecc. sono anche modificati.
Le impostazioni sono fatte con variabili d'ambiente, quindi potresti doverle conoscere se non hai già familiarità con il loro funzionamento.
libfaketime supporta offset relativi e assoluti, tempo di arresto e di esecuzione e accelerazione o rallentamento. Non so di correre indietro, però.
Si noti che la versione corrente finge che i secondi siano la massima risoluzione del tempo presente e trasmette parti secondarie delle risposte all'applicazione non modificata. Pertanto, se si rallenta l'orologio a metà velocità, un programma consapevole dei sub-secondi che effettua chiamate a tempo molto rapido sperimenterà l'intero secondo due volte uno dopo l'altro anziché una volta impiegando solo il doppio del tempo. Se l'orologio viene arrestato, ciò significa che l'applicazione vede un tempo casuale entro il secondo selezionato.
Sfortunatamente, Github è inattivo oggi, quindi i documenti non sono disponibili al momento, ma probabilmente saranno risolti presto.
Modificare:
Con il backup di Github l'ho provato e ho trovato il codice per il cambio di velocità abbastanza generale da funzionare bene con valori negativi o qualsiasi altra cosa accettata da atof()
.
Tuttavia, è emerso un problema diverso: per il cambio di velocità, è necessaria un'origine temporale oltre all'ora corrente reale e all'offset temporale desiderato. Questa origine è impostata in modo indipendente per i sottoprocessi, in modo che (quando si esegue all'indietro alla velocità nominale) quando il processo padre si è ritirato di un minuto, un sottoprocesso appena generato vedrà l'ora corrente due minuti dopo rispetto al processo padre.