LINUX.ORG.RU

monotonic timer


0

0

Нужна идея, как реализовать монотонное течение времени. Вопрос вот в чём. Допустим, мне надо отследить таймаут какого-то события, я запоминаю время начала события, делаю select/сетевые операции с теми, кто готов, проверяю таймауты. Всё отлично. Но, администратор сервера, вдруг обнаруживает, что на сервере уехало время, и делает ntpdate [таймсервер], который говорит: ок, время уехало на 6 часов вперёд, я его вернула назад. Таким образом, таймауты, которых запомнили 6 часов вперёд, провисят 6 часов до момента, пока их обнаружат.

Самым простым решением было бы использование какого-либо монотонно тикающего таймера, поскольку абсолютное время не важно, а только относительное. Однако, не использовать же для этого /proc/uptime, как-то некрасиво. Не могу сообразить, откуда взять монотонный таймер, чтобы это было не настолько linux-specific. Самостоятельно дёргать SIGALRM раз в секунду на Perl мне представляется неправильным, как и вообще работа с сигналами в Perl. Можно отслеживать таймауты из будущего и ресетить их, но таймауты из прошлого будут срабатывать слишком рано, а таймауты из будущего несколько запоздало. Можно попробовать решить проблему административно -- поставить ntpd, но это тоже не 100%-е решение.

В общем нужна идея монотонного таймера, нормально доступного из Perl, возможно даже с тредами.

★★★★★

Ответ на: комментарий от tailgunner

Пасиба! Благодаря этой наводке я нашёл в Perl POSIX::times(),
значение $realtime как раз то, что нужно!

#!/usr/bin/perl
use strict;
use POSIX;
my $clock_ticks = POSIX::sysconf(&POSIX::_SC_CLK_TCK);
for(my $i = 0; $i < 20; ++$i)
{
my ($rt) = POSIX::times();
print $rt/$clock_ticks, "\n";
sleep 1
}

Casus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.