LINUX.ORG.RU

Подскажите как более менее точно получать UTC время в долях секунды в С.

 , , , ,


0

1

Интересует все относящееся к теме. В первую очередь личный опыт. GMT скорее всего не то что нужно.

Раньше меня всегда устраивало локальное время полученное от интернет провайдера или оператора мобильной связи, поэтому я немного озадачен.

Под более-менее точно подразумевается что я хочу быть уверенным что полученный результат отличается от UTC не более чем на какуюто небольшую, наперед заданную величину, например 300 мс. Результат gettimeofday() и подобных вполне может отличатся на произволную величину.

Последнее что я накопал: ntp_gettime(), но покачто я не понял что гарантируется.

★★★★★

Последнее исправление: cvv (всего исправлений: 6)

Поставь и настрой ntpd. А дальше элементарно: gettimeofday и преобразования.

anonymous
()

Подскажите как более менее точно получать UTC время в долях секунды в С.

Ещё менее точно?
Используй генератор случайных чисел.

awesomelackware
()

На таких интервалах точно может быть только относительное время (спустя 10 микросекунд, например).

А ультрамегасуперточное время тебе никто не покажет. Слышал байку, что даже вшивые миллисекундные пульсары точнее атомных часов.

anonymous
()
Ответ на: комментарий от anonymous

А ультрамегасуперточное время тебе никто не покажет.

Этого не требуется. Точнее чем gettimeofday() в стандартно сконфигуренной системе.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

gettimeofday() выдаёт время с точностью до микросекунд, clock_gettime() - до наносекунд. Так что точнее в стандартно сконфигуренной системе. :)

Sorcerer ★★★★★
()
Ответ на: комментарий от cvv

А какова точность часиков в этой твоей «стандартно сконфигуренной системе»? И да, даже gettimeofday оперирует структурой, в которой есть обычный unixtimestamp и некие микросекунды, скорее всего вычисляемые делением тиков на частоту или как-то так.

anonymous
()
Ответ на: комментарий от Sorcerer

Эххх ... Тут подлянка в том что тут физически милисекундам неоткудова взятся, неговоря уже о микро и нано. Можешь рассматривать рассматривать всю дробную часть как тупой счетчик никак не коррелирующийся с UTC.

cvv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Тут проблема не в самой точности а в корреляции этих часиков с UTC. На всех обычных стандартных системах - она никакая. Что надо сделать чтобы хоть чтото гарантировалось я не знаю и собственно пытаюсь выяснить.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

Ну раз так...

struct timex timex = {
	.modes = 0,
};
int status = adjtimex(&timex);
assert(status != TIME_ERROR);

И дальше делаешь clock_gettime(CLOCK_REALTIME). :)

Иными словами: если точность системных энергонезависимых часов тебя не устраивает, то твой вопрос — не «как получить точное время из C», а «как вообще получить на машину точное время». Например, по NTP. И дальше получать его из C стандартными средствами.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от cvv

Почти всегда это одно и тоже.

Порядка 100 нс на ноуте между двумя последовательными вызовами. Это в 10 раз лучше, чем в принципе gettimeofday() с микросекундами в принципе может дать.

У тебя, наверное, просто таймера в системе точнее микросекунд нет.

i-rinat ★★★★★
()
Ответ на: комментарий от intelfx

то твой вопрос — не «как получить точное время из C», а «как вообще получить на машину точное время»

200%.

Например, по NTP.

Вам известны другие варианты? Выше предлагали по GPS.

И дальше получать его из C стандартными средствами.

Ты намекаешь на libntp?

cvv ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

У тебя, наверное, просто таймера в системе точнее микросекунд нет.

я имел ввиду немного другое: эти два вызова обращаются к одному и томуже физическому таймеру довольно плохо коррелирующемуся с UTC.

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от cvv

Вам известны другие варианты?

kernel PPS discipline, PTP... Ну то есть либо личные атомные часы, либо GPS, либо NTP. Ещё есть периодические радиосигналы, но у них точность низкая.

Ты намекаешь на libntp?

Я намекаю на то, что если в системных часах не хватает точности, то её нужно там сделать (любым доступным способом, откуда я знаю, что у тебя за условия). Я просто не понимаю вопроса: ты хочешь услышать какой-нибудь магический способ получить точное время на изолированном компьютере без аппаратных часов соответствующей точности?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

ты хочешь услышать какой-нибудь магический способ получить точное время на изолированном компьютере без аппаратных часов соответствующей точности?

не совсем. Я хочу быть уверенным что полученное время гарантированно не отличается от UTC более чем на некоторую небольшую, наперед заданную величину, например 100 мс. gettimeofday() и аналогичное вполне может вернуть 1970 год или что-то подобное.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

Ты нихера не понял из вышеописанного. 1. Та гоняешь ntpd на машине с часами и получаешь точное время. 2. Используешь стандартное API для оного (gettimeofday())

Если ты хочешь гарантий, тебе их никто не даст. Читай протоколы, думай что тебе нужно.

slapin ★★★★★
()
Ответ на: комментарий от cvv

Для этого достаточно проверить, что ntpd вышел на стабильный режим. Атомные часы тоже могут сломаться вообще-то.

Elyas ★★★★★
()
Ответ на: комментарий от Elyas

Для этого достаточно проверить, что ntpd вышел на стабильный режим.

Хм ... Полистаю доки

Атомные часы тоже могут сломаться вообще-то.

кстати, вам известны преценденты?

cvv ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Мой мозг был неготов :-) на сейчас ситуация более-менее прояснилась

cvv ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Elyas. Кстати, а случайно не в курсе как именно определить что синхронизация была потеряна? Ну там канал к вышестоящему NTP серверу лёг ... По документации я понял что это возможно не непонял как именно.

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от cvv

Попробуй через тот же adjtimex()? Ну то есть я не знаю, выставляет ли ntpd флаг STA_UNSYNC, если связь легла после успешной синхронизации, но по здравому смыслу — должен выставлять, как минимум когда определит, что предсказанная ошибка вышла за пределы допустимого. Думаю, логично просто проверять возвращаемое значение adjtimex() в режиме чтения (timex.modes == 0).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 6)
Ответ на: комментарий от anonymous

Нормальные чуваки в «продакшн» ничего не пишут!

anonymous
()
Ответ на: комментарий от intelfx

Ты только преподавать не иди.

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