Следующий код в Ubuntu 12.04 LTS:
#include <stdio.h>
#include <sys/timex.h>
#include <sys/time.h>
int main(int argc, char **argv)
{
struct timeval tv;
gettimeofday(&tv, NULL);
struct ntptimeval ntptv;
ntp_gettime(&ntptv);
printf("gettimeofday: tv_sec = %ld, tv_usec = %ld\n",
tv.tv_sec, tv.tv_usec);
printf("ntp_gettime: tv_sec = %ld, tv_usec = %ld\n",
ntptv.time.tv_sec, ntptv.time.tv_usec);
}
возвращает:
gettimeofday: tv_sec = 1366209548, tv_usec = 137736
ntp_gettime: tv_sec = 1366209548, tv_usec = 137743081
Это немного странно, потому что значение tv_usec
, если оно действительно является микросекундным счетчиком, не должно быть больше 1000000. Результат, показанный выше, заставляет меня думать, что ntp_gettime()
на самом деле возвращает наносекундную точность.
ntp_gettime()
Справочная страница (для точности) по адресу http://manpages.ubuntu.com/manpages/precise/man2/ntp_gettime.2freebsd.html на самом деле мало что говорит.
Более ранняя версия справочной страницы (для Hardy) http://manpages.ubuntu.com/manpages/hardy/man2/ntp_gettime.2.html утверждает, что это может быть либо наносекунда, либо микросекунда, в зависимости от того, установлен ли бит STA_NANO
в слове status
, возвращаемом ntp_adjtime()
.
Кто-нибудь знает окончательно? Кроме того, где ntp_gettime()
, ntp_adjtime()
и все различные внутренние функции, которые они вызывают, определены в исходном коде 12.04?