Как да забавя всички времеви измервания на процес?

Бих искал да накарам приложение да вярва, че времето тече по-бързо/по-бавно от реалното време. т.е. Трябва да накарам всички API за измерване на времето да връщат t0+dt*s с дефинирани от потребителя s, когато t0+dt е в реално време. Това би засегнало всичко като gettimeofday(), както и timer_gettime() и всички свързани функции и механизми (включително действителните времена на задействане на таймерите).

Мисля да сложа кука някъде, която да промени видимото време за приложението.

В Linux система кое е най-доброто място за поставяне на такава кука, така че да не се налага да създавам твърде много кукички? Има ли централно място за това?


person Ruslan    schedule 16.08.2014    source източник


Отговори (1)


Можете да използвате трика LD_PRELOAD, описан в този въпрос.
Libfaketime изглежда прави точно това, от което се нуждаете (вижте README под „Разширени опции за спецификация на времето“). Следващият пример показва, че времето върви 2 пъти по-бавно за "заспиване":

$ time FAKETIME="x0.5" LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 sleep 1
real    0m2.002s
user    0m0.000s
sys 0m0.000s

(на система debian, следователно /usr/lib/)

Ако всъщност не прави това, което искате, вместо да пускате свое собствено решение, предлагам да вземете неговия източник и да приложите това, от което се нуждаете, оттам.

За пълнота, друга възможна начална точка е datefudge.

person Leo Antunes    schedule 16.08.2014
comment
Те изглежда само изместват времето, но не променят неговия мащаб. А именно, те не засягат никакви таймери. Както и да е, благодаря за първите насоки в тази посока. - person Ruslan; 17.08.2014
comment
@Ruslan: Може би не разбрах какво имаш предвид под промяна на мащаба, но това изглежда работи добре: 'time FAKETIME=x0.5 LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 заспиване 1' отнема точно 2 секунди вместо 1 (променен отговор, за да сочи към този пример) - person Leo Antunes; 17.08.2014
comment
А, наистина, пропуснах това в документите. Странно, въпреки че таймерите променят скоростта, localtime все още получава реалното време. Както и да е, мисля, че това е достатъчно добър отговор за начало, благодаря. - person Ruslan; 17.08.2014