| adjtimex(2) | System Calls Manual | adjtimex(2) |
adjtimex, clock_adjtime, ntp_adjtime - dopasowuje zegar w jądrze
Standardowa biblioteka C (libc, -lc)
#include <sys/timex.h>
int adjtimex(struct timex *buf);
int clock_adjtime(clockid_t clk_id, struct timex *buf);
int adjtimex(struct timex *buf);
Linux używa algorytmu dopasowywania Davida L. Millsa (zob. w RFC 1305). Wywołanie systemowe adjtimex czyta i opcjonalnie ustawia parametry sterujące tego algorytmu. Pobiera wskaźnik do struktury timex, aktualizuje parametry w jądrze na podstawie (wybranych) wartości przekazanych w polach i zwraca tę samą strukturę z bieżącymi ustawieniami jądra. Struktura jest zadeklarowana następująco:
struct timex {
int modes; /* Wybór trybu */
long offset; /* Przesunięcie czasu; nanosekundy jeśli
ustawiono znacznik statusu STA_NANO, jeśli
nie - mikrosekundy */
long freq; /* Przesunięcie częstotliwości; zob. UWAGI
dotyczące jednostek */
long maxerror; /* Maksymalny błąd (mikrosekundy) */
long esterror; /* Szacowany błąd (mikrosekundy) */
int status; /* Polecenie/status zegara */
long constant; /* Stała czasu PLL (phase-locked loop) */
long precision; /* Precyzja zegara
(mikrosekundy, tylko do odczytu) */
long tolerance; /* Tolerancja częstotliwości zegara (tylko do
odczytu); zob. UWAGI dotyczące jednostek */
struct timeval time;
/* Bieżący czas (tylko do odczytu, za wyjątkiem
ADJ_SETOFFSET); przy powrocie time.tv_usec
zawiera nanosekundy jeśli ustawiono znacznik
statusu STA_NANO, jeśli nie - mikrosekundy */
long tick; /* Mikrosekundy pomiędzy impulsami zegara */
long ppsfreq; /* Częstotliwość PPS (pulse per second) (tylko
do odczytu); zob. UWAGI dot. jednostek */
long jitter; /* Fluktuacja PPS (tylko do odczytu); nanosek.
jeśli ustawiono znacznik statusu STA_NANO,
jeśli nie - mikrosekundy */
int shift; /* Czas interwału PPS
(sekundy, tylko do odczytu) */
long stabil; /* Stabilność PPS (tylko do odczytu);
zob. UWAGI dotyczące jednostek */
long jitcnt; /* Liczba zdarzeń wykroczenia poza limit
fluktuacji PPS (tylko do odczytu) */
long calcnt; /* Liczba interwałów kalibracji PPS
(tylko do odczytu) */
long errcnt; /* Liczba interwałów błędów PPS
(tylko do odczytu) */
long stbcnt; /* Liczba zdarzeń wykroczenia poza limit
stabilności PPS (tylko do odczytu) */
int tai; /* Przesunięcie TAI, zgodnie z ustawieniem
poprzednią operacją ADJ_TAI (sekundy,
tylko do odczytu, od Linuksa 2.6.26) */
/* Kolejne bajty wyrównania do przyszłych rozszerzeń */
};
Pole modes określa, które parametry (jeśli w ogóle) ustawić (jak opisano później w niniejszym podręczniku, stałe używane w ntp_adjtime() są równoważne, lecz inaczej nazwane). Jest to maska bitowa zawierająca sumę bitową (OR) kombinacji zera lub więcej spośród następujących bitów:
while (buf.time.tv_usec < 0) {
buf.time.tv_sec -= 1;
buf.time.tv_usec += 1000000000;
}
Alternatywnie, można podać modes jako jedną z następujących wartości (wielobitowej maski); wówczas w modes nie należy podawać innych bitów:
Zwykli użytkownicy są ograniczeni do wartości 0 lub ADJ_OFFSET_SS_READ dla modes. Jedynie superużytkownik może ustawiać jakiekolwiek parametry.
Pole buf.status jest maską bitową używaną do ustawiania/pobierania bitów statusu powiązanych z implementacją NTP. Niektóre bity w masce można odczytać i ustawić, inne są tylko do odczytu.
Próby ustawienia bitów statusu tylko do odczytu są po cichu ignorowane.
Wywołanie systemowe clock_adjtime() (dodane w Linuksie 2.6.39) zachowuje się jak adjtimex(), lecz przyjmuje dodatkowy argument clk_id określający konkretny zegar, na którym ma działać.
Funkcja biblioteczna ntp_adjtime() (opisana w „Kernel Application Program API” — KAPI NTP) jest bardziej przenośnym interfejsem, wykonującym takie samo zadanie jak adjtimex(). Oprócz poniższych punktów, jest identyczne do adjtimex():
W przypadku powodzenia, adjtimex() i ntp_adjtime() zwracają stan zegara; tj. jedną z poniższych wartości:
Proszę zauważyć, że poczynając od Linuksa 3.4, wywołanie działa asynchronicznie i zwracana wartość zwykle nie oddaje zmiany stanu spowodowanej przez samo wywołanie.
W przypadku błędu, wywołania zwracają -1 i ustawiają errno wskazując błąd.
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
| Interfejs | Atrybut | Wartość |
| ntp_adjtime() | Bezpieczeństwo wątkowe | MT-bezpieczne |
Preferowanym API do demona NTP jest ntp_adjtime().
W strukturach timex, freq, ppsfreq i stabil występują ppm (części na milion) z 16-bitową częścią ułamkową, co oznacza, że wartość w tych polach wynosi tak naprawdę 2^-16 ppm, a 2^16=65536 jest równe 1 ppm. Jest to prawdziwe zarówno w przypadku wartości wejściowych (stosowane do freq) i wyjściowych.
Przetwarzanie sekundy przestępnej, wyzwolone przez STA_INS i STA_DEL jest dokonywane przez jądro w kontekście czasomierza. Z tego względu, zajmie to jeden impuls w sekundzie, zanim sekunda przestępna zostanie dodana lub usunięta.
clock_gettime(2), clock_settime(2), settimeofday(2), adjtime(3), ntp_gettime(3), capabilities(7), time(7), adjtimex(8), hwclock(8)
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
| 2 maja 2024 r. | Linux man-pages 6.9.1 |