Man clock_gettime (2) функції годинника і часу

int clock_getres (clockid_tclk_id, struct timespec * res);

int clock_gettime (clockid_tclk_id, struct timespec * tp);

int clock_settime (clockid_tclk_id, const struct timespec * tp);

Компонується при вказівці параметра -lrt (тільки для glibc до версії 2.17).

Вимоги макросу тестування властивостей для glibc (див. Feature_test_macros (7)):

clock_getres (), clock_gettime (), clock_settime ():

Функція clock_getres () визначає роздільну здатність (точність) заданих в clk_id годин, і, якщо res не дорівнює NULL, зберігає її в struct timespec. зазначену в res. Точність годин залежить від реалізації і не може бути налаштована певним процесом. Якщо значення часу, вказане в аргументі tp функції clock_settime (), не кратне res. то воно буде скорочуватися до кратного res.

Функції clock_gettime () і clock_settime () отримують і встановлюють час зазначених годин clk_id.

Аргументи res і tp представляють структуру timespec. певну в .

Аргумент clk_id представляє ідентифікатор певних годин, над якими проводиться дію. Годинники можуть використовуватися системою в цілому і тому видимі всім процесам або конкретного процесу, якщо вони відраховують час тільки в межах одного процесу.

Все реалізації підтримують системний годинник реального часу, які мають ідентифікатор CLOCK_REALTIME. Їх час представляється в секундах і наносекундах з початку Епохи. Коли їх час змінюється, на таймери з відносними інтервалами це ніяк не впливає, але таймери з абсолютною точкою в часі враховують це.

Може бути реалізовано багато годин. Подання відповідних значень часу і вплив на таймери не визначене.

В останніх версіях glibc і ядра Linux підтримуються наступні години:

CLOCK_REALTIME Годинники системи, що відлічує реальне (т. Е. Побутове) час. Для настройки цього годинника потрібні відповідні права. Дані годинник схильні до стрибків системного часу (наприклад, якщо системний адміністратор вручну змінює час) і поступової підгонці, виконуваної adjtime (3) і NTP. CLOCK_REALTIME_COARSE (починаючи з Linux 2.6.32; є тільки в Linux) Більш швидка, але менш точна версія CLOCK_REALTIME. Використовуйте, якщо потрібні не дуже точні часові позначки, але швидко. CLOCK_MONOTONIC Годинники, які не можуть бути налаштовані і показують монотонний хід часу відлічуваної з якоїсь невизначеної початкової точки. Цей годинник не схильні до стрибків системного часу (наприклад, системний адміністратор вручну змінив час), але на них впливає поступова підгонка, виконувана adjtime (3) і NTP. CLOCK_MONOTONIC_COARSE (починаючи з Linux 2.6.32; є тільки в Linux) Більш швидка, але менш точна версія CLOCK_MONOTONIC. Використовуйте, якщо потрібні не дуже точні часові позначки, але швидко. CLOCK_MONOTONIC_RAW (починаючи з Linux 2.6.28; є тільки в Linux) Схожі на CLOCK_MONOTONIC. але надають прямий доступ до апаратних годинах, що не підводяться NTP або поступової підгонкою, виконуваної adjtime (3). CLOCK_BOOTTIME (починаючи з Linux 2.6.39; є тільки в Linux) Ідентичні CLOCK_MONOTONIC. але також містять будь-який час, на яке система була припинена (suspended). Це дозволяє додаткам отримати враховують припинення монотонні годинник без звернення до складнощів CLOCK_REALTIME. які можуть бути неоднорідні, якщо час змінили за допомогою settimeofday (2). CLOCK_PROCESS_CPUTIME_ID (починаючи з Linux 2.6.12), що настроюються для кожного процесу годинник ЦП (вимірюють час ЦП, витрачений усіма нитками процесу). CLOCK_THREAD_CPUTIME_ID (починаючи з Linux 2.6.12) Годинники, що працюють на ЦП, для кожної нитки.

ПОВЕРНЕНЕ ЗНАЧЕННЯ

При успішному виконанні функції clock_gettime (), clock_settime () і clock_getres () повертають 0, або -1 у випадку помилки (errno встановлюється відповідним чином змінити значення).

Дані системні виклики вперше з'явилися в Linux 2.6.

ДОСТУПНІСТЬ

На POSIX-системах, в яких доступні ці функції, символ _POSIX_TIMERS. визначений у . має значення більше 0. Символами _POSIX_MONOTONIC_CLOCK. _POSIX_CPUTIME. _POSIX_THREAD_CPUTIME показується, що доступні CLOCK_MONOTONIC. CLOCK_PROCESS_CPUTIME_ID. CLOCK_THREAD_CPUTIME_ID. (Див. Також sysconf (3).)

Історична довідка про системи SMP

До того, як в Linux була додана підтримка CLOCK_PROCESS_CPUTIME_ID і CLOCK_THREAD_CPUTIME_ID. реалізація цього годинника в glibc на багатьох платформах використовувала регістри таймери ЦП (TSC на i386, AR.ITC на Itanium). Ці регістри можуть відрізнятися у різних ЦП і, як наслідок, цей годинник може повертати підроблені результати. якщо виконання процесу переходить на інший ЦП.

Якщо процесори в багатопроцесорних системах використовують різні джерела часу, то немає способу підтримувати звірку між регістрами таймера, так як кожен ЦП буде працювати зі злегка відрізняється частотою. В цьому випадку clock_getcpuclockid (0) поверне ENOENT. щоб вказати на цей стан. Двоє годин в цьому випадку будуть корисні, тільки якщо можна переконатися, що процес залишився на певному ЦП.

Процесори в багатопроцесорних системах немає приступають до роботи одночасно і тому регістри таймера зазвичай працюють зі зміщенням. Деякі архітектури містять код, який намагається скоротити це зміщення при завантаженні системи. Однак код не може гарантувати точне підстроювання зсувів. У glibc немає коштів для роботи з цими зміщеннями (на відміну від ядра Linux). Зазвичай, ці зсуви малі і тому, в більшості випадків, їх вплив незначний.

Починаючи з glibc 2.4, обгортковий функції системних викликів, описаних на цій сторінці, не мають таких проблем, так як використовують ядерну реалізацію CLOCK_PROCESS_CPUTIME_ID і CLOCK_THREAD_CPUTIME_ID (в системах, які її надають, тобто Linux 2.6.12 і новіше).

Схожі статті