clock_getres(2) - wariua/manpages-ko GitHub Wiki

NAME

clock_getres, clock_gettime, clock_settime - 클럭 및 μ‹œκ°„ ν•¨μˆ˜λ“€

SYNOPSIS

#include <time.h>

int clock_getres(clockid_t clk_id, struct timespec *res);

int clock_gettime(clockid_t clk_id, struct timespec *tp);
 
int clock_settime(clockid_t clk_id, const struct timespec *tp);

-lrt둜 링크 (glibc 버전 2.17 μ „μ—μ„œλ§Œ).

glibc κΈ°λŠ₯ 확인 맀크둜 μš”κ±΄ (feature_test_macros(7) μ°Έκ³ ):

clock_getres(), clock_gettime(), clock_settime():
_POSIX_C_SOURCE >= 199309L

DESCRIPTION

clock_getres() ν•¨μˆ˜λŠ” μ§€μ •ν•œ 클럭 clk_id의 해상도(정밀도)λ₯Ό μ•Œμ•„λ‚΄κ³ , resκ°€ NULL이 μ•„λ‹ˆλ©΄ resκ°€ κ°€λ¦¬ν‚€λŠ” struct timespec에 κ·Έ 해상도λ₯Ό μ €μž₯ν•œλ‹€. 클럭의 ν•΄μƒλ„λŠ” κ΅¬ν˜„μ²΄μ— 따라 달라지며 νŠΉμ • ν”„λ‘œμ„ΈμŠ€κ°€ μ„€μ •ν•  수 μžˆλŠ” 것이 μ•„λ‹ˆλ‹€. clock_settime()의 인자 tpκ°€ κ°€λ¦¬ν‚€λŠ” μ‹œκ°„ 값이 res의 λ°°μˆ˜κ°€ μ•„λ‹ˆλ©΄ λ°°μˆ˜κ°€ 되게 μž˜λΌλ‚Έλ‹€.

ν•¨μˆ˜ clock_gettime() 및 clock_settime()은 μ§€μ •ν•œ 클럭 clk_id의 μ‹œκ°„μ„ κ°€μ Έμ˜€κ±°λ‚˜ μ„€μ •ν•œλ‹€.

res 및 tp μΈμžλŠ” <time.h>에 μžˆλŠ” timespec ꡬ쑰체이닀.

struct timespec {
    time_t   tv_sec;        /* 초 */
    long     tv_nsec;       /* λ‚˜λ…Έμ΄ˆ */
};

clk_id μΈμžλŠ” λ™μž‘μ„ μˆ˜ν–‰ν•  ꡬ체적 클럭의 μ‹λ³„μžμ΄λ‹€. ν΄λŸ­μ€ μ‹œμŠ€ν…œ μ „μ—­μ΄μ–΄μ„œ λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 보일 μˆ˜λ„ 있고 ν”„λ‘œμ„ΈμŠ€λ³„λ‘œ μžˆμ–΄μ„œ ν•œ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œλ§Œ μ‹œκ°„μ„ μΈ‘μ •ν•  μˆ˜λ„ μžˆλ‹€.

λͺ¨λ“  κ΅¬ν˜„μ²΄λŠ” μ‹œμŠ€ν…œ μ „μ—­ μ‹€μ œ μ‹œκ°„ ν΄λŸ­μ„ μ œκ³΅ν•˜λ©° CLOCK_REALTIME으둜 이λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이 클럭의 μ‹œκ°„μ€ 에포크 이후 μ§€λ‚œ μ΄ˆμ™€ λ‚˜λ…Έμ΄ˆλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이 클럭의 μ‹œκ°„μ΄ λ°”λ€” λ•Œ μƒλŒ€μ  μ‹œκ°„μ˜ νƒ€μ΄λ¨ΈλŠ” 영ν–₯을 λ°›μ§€ μ•Šμ§€λ§Œ μ ˆλŒ€μ  μ‹œμ μ— λŒ€ν•œ νƒ€μ΄λ¨ΈλŠ” 영ν–₯을 λ°›λŠ”λ‹€.

더 λ§Žμ€ ν΄λŸ­λ“€μ΄ κ΅¬ν˜„λ˜μ–΄ μžˆμ„ 수 μžˆλ‹€. ν•΄λ‹Ήν•˜λŠ” μ‹œκ°„ 값을 ν•΄μ„ν•˜λŠ” 방식과 타이머에 λŒ€ν•œ 영ν–₯은 λͺ…μ„Έλ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

μΆ©λΆ„νžˆ μ΅œμ‹ μΈ glibc 및 λ¦¬λˆ…μŠ€ μ»€λ„μ—μ„œλŠ” λ‹€μŒ ν΄λŸ­λ“€μ„ μ§€μ›ν•œλ‹€.

CLOCK_REALTIME
μ‹€μ œ μ‹œκ°„μ„ (즉 λ²½μ‹œκ³„ μ‹œκ°„μ„) μž¬λŠ” μ‹œμŠ€ν…œ μ „μ—­ 클럭. 이 ν΄λŸ­μ„ μ„€μ •ν•˜λ €λ©΄ μ μ ˆν•œ 특ꢌ이 ν•„μš”ν•˜λ‹€. 이 ν΄λŸ­μ€ μ‹œμŠ€ν…œ μ‹œκ°„μ˜ λΆˆμ—°μ†μ  도약(κ°€λ Ή μ‹œμŠ€ν…œ κ΄€λ¦¬μžκ°€ μˆ˜λ™μœΌλ‘œ ν΄λŸ­μ„ λ³€κ²½ν•˜λŠ” 경우)κ³Ό adjtime(3) 및 NTPκ°€ μˆ˜ν–‰ν•˜λŠ” 점진적 쑰정에 영ν–₯을 λ°›λŠ”λ‹€.
CLOCK_REALTIME_COARSE (λ¦¬λˆ…μŠ€ 2.6.32λΆ€ν„°. λ¦¬λˆ…μŠ€ μ „μš©.)
CLOCK_REALTIME의 더 λΉ λ₯΄μ§€λ§Œ 덜 μ •ν™•ν•œ 버전. μ•„μ£Ό λΉ λ₯΄λ˜ μ •λ°€ν•˜μ§€λŠ” μ•Šμ€ νƒ€μž„μŠ€νƒ¬ν”„κ°€ ν•„μš”ν•  λ•Œ μ“°λ©΄ λœλ‹€. μ•„ν‚€ν…μ²˜λ³„ 지원이 ν•„μš”ν•˜λ©°, vdso(7) λ‚΄μ—μ„œ 이 ν”Œλž˜κ·Έμ— λŒ€ν•œ μ•„ν‚€ν…μ²˜ 지원도 ν•„μš”ν•  것이닀.
CLOCK_MONOTONIC

"μ–΄λ–€ κ·œμ •λΌ μžˆμ§€ μ•Šμ€ μ‹œμ "(POSIX의 μ„œμˆ )λΆ€ν„° 단쑰 μ¦κ°€ν•˜λŠ” μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λ©° μ„€μ •ν•  수 μ—†λŠ” 클럭. λ¦¬λˆ…μŠ€μ—μ„œλŠ” μ‹œμŠ€ν…œμ΄ λΆ€νŒ… ν•˜κ³  λ™μž‘ν•œ 초 μˆ˜μ— ν•΄λ‹Ήν•œλ‹€.

CLOCK_MONOTONIC ν΄λŸ­μ€ μ‹œμŠ€ν…œ μ‹œκ°„μ˜ λΆˆμ—°μ†μ  도약(κ°€λ Ή μ‹œμŠ€ν…œ κ΄€λ¦¬μžκ°€ μˆ˜λ™μœΌλ‘œ ν΄λŸ­μ„ λ³€κ²½ν•˜λŠ” 경우)μ—λŠ” 영ν–₯을 λ°›μ§€ μ•Šμ§€λ§Œ adjtime(3) 및 NTPκ°€ μˆ˜ν–‰ν•˜λŠ” 점진적 μ‘°μ •μ—λŠ” 영ν–₯을 λ°›λŠ”λ‹€. μ‹œμŠ€ν…œμ΄ μ ˆμ „ λŒ€κΈ° μƒνƒœμΈ μ‹œκ°„μ€ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

CLOCK_MONOTONIC_COARSE (λ¦¬λˆ…μŠ€ 2.6.32λΆ€ν„°. λ¦¬λˆ…μŠ€ μ „μš©.)
CLOCK_MONOTONIC의 더 λΉ λ₯΄μ§€λ§Œ 덜 μ •ν™•ν•œ 버전. μ•„μ£Ό λΉ λ₯΄λ˜ μ •λ°€ν•˜μ§€λŠ” μ•Šμ€ νƒ€μž„μŠ€νƒ¬ν”„κ°€ ν•„μš”ν•  λ•Œ μ“°λ©΄ λœλ‹€. μ•„ν‚€ν…μ²˜λ³„ 지원이 ν•„μš”ν•˜λ©°, vdso(7) λ‚΄μ—μ„œ 이 ν”Œλž˜κ·Έμ— λŒ€ν•œ μ•„ν‚€ν…μ²˜ 지원도 ν•„μš”ν•  것이닀.
CLOCK_MONOTONIC_RAW (λ¦¬λˆ…μŠ€ 2.6.28λΆ€ν„°. λ¦¬λˆ…μŠ€ μ „μš©.)
CLOCK_MONOTONICκ³Ό μœ μ‚¬ν•˜λ˜ NTP μ‘°μ •μ΄λ‚˜ adjtime(3)이 μˆ˜ν–‰ν•˜λŠ” 점진적 μ‘°μ •μ˜ 영ν–₯을 λ°›μ§€ μ•ŠλŠ” ν•˜λ“œμ›¨μ–΄ 기반 μ‹œκ°„μ— λŒ€ν•œ 접근을 μ œκ³΅ν•œλ‹€. μ‹œμŠ€ν…œμ΄ μ ˆμ „ λŒ€κΈ° μƒνƒœμΈ μ‹œκ°„μ€ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.
CLOCK_BOOTTIME (λ¦¬λˆ…μŠ€ 2.6.39λΆ€ν„°. λ¦¬λˆ…μŠ€ μ „μš©.)
CLOCK_MONOTONICκ³Ό λ™μΌν•˜λ˜ μ‹œμŠ€ν…œμ΄ μ ˆμ „ λŒ€κΈ° μƒνƒœμΈ μ‹œκ°„λ„ ν¬ν•¨ν•œλ‹€. settimeofday(2) 등을 μ΄μš©ν•΄ μ‹œκ°„μ„ λ°”κΎΈλ©΄ λΆˆμ—°μ†μ μΌ μˆ˜λ„ μžˆλŠ” CLOCK_REALTIME의 λ³΅μž‘ν•¨μ„ μ‘μš©μ—μ„œ λ‹€λ£° ν•„μš” 없이 μ ˆμ „ λŒ€κΈ°λ₯Ό μΈμ‹ν•˜λŠ” 단쑰 증가 ν΄λŸ­μ„ 얻을 수 μžˆλ‹€.
CLOCK_PROCESS_CPUTIME_ID (λ¦¬λˆ…μŠ€ 2.6.12λΆ€ν„°.)
ν”„λ‘œμ„ΈμŠ€λ³„ CPU μ‹œκ°„ 클럭. (ν”„λ‘œμ„ΈμŠ€ λ‚΄ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ΄ μ†Œλͺ¨ν•œ CPU μ‹œκ°„μ„ 츑정함.)
CLOCK_THREAD_CPUTIME_ID (λ¦¬λˆ…μŠ€ 2.6.12λΆ€ν„°.)
μŠ€λ ˆλ“œ ν•œμ • CPU μ‹œκ°„ 클럭.

RETURN VALUE

clock_gettime(), clock_settime(), clock_getres()λŠ” 성곡 μ‹œ 0을 λ°˜ν™˜ν•˜κ³  μ‹€νŒ¨ μ‹œ -1을 λ°˜ν™˜ν•œλ‹€. (그리고 μ‹€νŒ¨ν•œ 경우 errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.)

ERRORS

EFAULT
tpκ°€ μ ‘κ·Ό κ°€λŠ₯ν•œ μ£Όμ†Œ 곡간 밖을 가리킀고 μžˆλ‹€.
EINVAL
μ§€μ •ν•œ clk_idλ₯Ό 이 μ‹œμŠ€ν…œμ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
EINVAL (λ¦¬λˆ…μŠ€ 4.3λΆ€ν„°)
clk_idλ₯Ό CLOCK_REALTIME으둜 ν•œ clock_settime() ν˜ΈμΆœμ—μ„œ μ‹œκ°„μ„ CLOCK_MONOTINIC 클럭 ν˜„μž¬ 값보닀 μž‘μ€ κ°’μœΌλ‘œ μ„€μ •ν•˜λ € ν–ˆλ‹€.
EPERM
clock_settime()μ—μ„œ ν‘œμ‹œ ν΄λŸ­μ„ μ„€μ •ν•  κΆŒν•œμ„ κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.

VERSIONS

λ¦¬λˆ…μŠ€ 2.6μ—μ„œ 이 μ‹œμŠ€ν…œ ν˜ΈμΆœλ“€μ΄ 처음 λ“±μž₯ν–ˆλ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
clock_getres(), clock_gettime(),
clock_settime()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, SUSv2.

AVAILABILITY

이 ν•¨μˆ˜λ“€μ΄ μ‚¬μš© κ°€λŠ₯ν•œ POSIX μ‹œμŠ€ν…œμ—λŠ” <unistd.h>에 심볼 _POSIX_TIMERSκ°€ 0보닀 큰 κ°’μœΌλ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€. 심볼 _POSIX_MONOTONIC_CLOCK, _POSIX_CPUTIME, _POSIX_THREAD_CPUTIME은 CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_IDκ°€ μ‚¬μš© κ°€λŠ₯함을 λ‚˜νƒ€λ‚Έλ‹€. (sysconf(3)도 μ°Έκ³ .)

NOTES

POSIX.1μ—μ„œ λ‹€μŒκ³Ό 같이 λͺ…μ„Έν•˜κ³  μžˆλ‹€.

clock_settime()을 톡해 CLOCK_REALTIME 클럭의 값을 μ„€μ •ν•˜λŠ” 것이 nanosleep()을 포함해 이 클럭 기반의 μƒλŒ€μ  μ‹œκ°„ μ„œλΉ„μŠ€λ₯Ό 기닀리며 블둝 λ˜μ–΄ μžˆλŠ” μŠ€λ ˆλ“œλ“€μ— μ–΄λ–€ 영ν–₯도 λΌμΉ˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©°, 이 클럭 기반의 μƒλŒ€μ  νƒ€μ΄λ¨Έμ˜ λ§Œλ£Œμ— λŒ€ν•΄μ„œλ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. λ”°λΌμ„œ 이런 μ‹œκ°„ μ„œλΉ„μŠ€λ“€μ€ κ·Έ 클럭의 μ‹ κ·œ λ‚΄μ§€ 이전 κ°’κ³Ό 상관없이 μš”μ²­ν–ˆλ˜ μƒλŒ€μ  μ‹œκ°„μ΄ κ²½κ³Όν–ˆμ„ λ•Œμ— λ§Œλ£Œλ˜μ–΄μ•Ό ν•œλ‹€.

C 라이브러리/컀널 차이

일뢀 μ•„ν‚€ν…μ²˜μ—μ„œλŠ” clock_gettime() κ΅¬ν˜„μ„ vdso(7)둜 μ œκ³΅ν•œλ‹€.

SMP μ‹œμŠ€ν…œ κ΄€λ ¨ 역사적 기둝

λ¦¬λˆ…μŠ€μ— CLOCK_PROCESS_CPUTIME_ID 및 CLOCK_THREAD_CPUTIME_ID에 λŒ€ν•œ 컀널 지원이 μΆ”κ°€λ˜κΈ° 전에 glibcμ—μ„œλŠ” μ—¬λŸ¬ ν”Œλž«νΌλ“€μ—μ„œ CPU의 타이머 λ ˆμ§€μŠ€ν„°(i386의 TSC, Itanium의 AR.ITC)λ₯Ό μ΄μš©ν•΄ 이 ν΄λŸ­λ“€μ„ κ΅¬ν˜„ν–ˆλ‹€. 이런 λ ˆμ§€μŠ€ν„°λ“€μ€ CPUλ§ˆλ‹€ 값이 λ‹€λ₯Ό μˆ˜λ„ 있으며 그둜 인해 ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ CPU둜 μ΄μ „ν•˜λŠ” 경우 이 ν΄λŸ­λ“€μ΄ 엉터리 κ²°κ³Όλ₯Ό 내놓을 μˆ˜λ„ μžˆλ‹€.

SMP μ‹œμŠ€ν…œμ—μ„œ CPU듀이 클럭 μ›μ²œμ΄ μ„œλ‘œ λ‹€λ₯΄λ©΄ 각 CPUκ°€ 살짝 λ‹€λ₯Έ μ§„λ™μˆ˜λ‘œ λ™μž‘ν•  κ²ƒμ΄λ―€λ‘œ κ·Έ 타이머 λ ˆμ§€μŠ€ν„°λ“€ 사이에 연관성을 μœ μ§€ν•  방법이 μ—†λ‹€. 그런 κ²½μš°μ— clock_getcpuclockid(0)은 ENOENTλ₯Ό λ°˜ν™˜ν•˜μ—¬ 이런 상황을 λ‚˜νƒ€λ‚Έλ‹€. 그럴 λ•ŒλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ νŠΉμ • CPU에 머물러 μžˆλ‹€κ³  ν™•μ‹ ν•  수 μžˆλŠ” κ²½μš°μ—λ§Œ 두 클럭이 μ“Έλͺ¨κ°€ 있게 λœλ‹€.

SMP μ‹œμŠ€ν…œ λ‚΄μ˜ ν”„λ‘œμ„Έμ„œλ“€μ΄ λͺ¨λ‘ μ •ν™•νžˆ 같은 λ•Œμ— μ‹œμž‘ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— 보톡은 타이머 λ ˆμ§€μŠ€ν„°λ“€μ΄ 차이λ₯Ό κ°€μ§€κ³  λˆλ‹€. μ–΄λ–€ μ•„ν‚€ν…μ²˜λ“€μ—λŠ” λΆ€νŒ… λ•Œ 이 차이λ₯Ό μ œν•œν•˜λ €κ³  μ‹œλ„ν•˜λŠ” μ½”λ“œκ°€ λ“€μ–΄μžˆλ‹€. ν•˜μ§€λ§Œ κ·Έ μ½”λ“œκ°€ 차이λ₯Ό μ •ν™•ν•˜κ²Œ μ‘°μ •ν•œλ‹€κ³  보μž₯ν•˜μ§€λŠ” λͺ»ν•œλ‹€. glibcμ—λŠ” (λ¦¬λˆ…μŠ€ 컀널과 달리) 이런 차이λ₯Ό 닀루기 μœ„ν•œ μ–΄λ–€ λŒ€λΉ„μ±…λ„ 담겨 μžˆμ§€ μ•Šλ‹€. 보톡 이 μ°¨μ΄λŠ” μž‘κΈ° λ•Œλ¬Έμ— λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—μ„œλŠ” κ·Έ 효과λ₯Ό λ¬΄μ‹œν•  수 μžˆλ‹€.

glibc 2.4λΆ€ν„°λŠ” 이 νŽ˜μ΄μ§€μ—μ„œ κΈ°μˆ ν•˜λŠ” μ‹œμŠ€ν…œ ν˜ΈμΆœλ“€μ— λŒ€ν•œ 래퍼 ν•¨μˆ˜λ“€μ΄ CLOCK_PROCESS_CPUTIME_ID 및 CLOCK_THREAD_CPUTIME_ID의 컀널 κ΅¬ν˜„μ„ μ œκ³΅ν•˜λŠ” μ‹œμŠ€ν…œ(즉 λ¦¬λˆ…μŠ€ 2.6.12 및 이후)μ—μ„œλŠ” κ·Έ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜μ—¬ μ•žμ„œ μ–ΈκΈ‰ν•œ λ¬Έμ œλ“€μ„ ν”Όν•œλ‹€.

BUGS

POSIX.1-2001에 λ”°λ₯΄λ©΄ "μ μ ˆν•œ 특ꢌ"을 κ°€μ§„ ν”„λ‘œμ„ΈμŠ€κ°€ clock_settime()을 μ΄μš©ν•΄ CLOCK_PROCESS_CPUTIME_ID 및 CLOCK_THREAD_CPUTIME_ID ν΄λŸ­μ„ μ„€μ •ν•  수 μžˆλ‹€. λ¦¬λˆ…μŠ€μ—μ„œ 이 ν΄λŸ­λ“€μ€ μ„€μ • κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€. (즉, μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€λ„ "μ μ ˆν•œ 특ꢌ"을 κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.)

SEE ALSO

date(1), gettimeofday(2), settimeofday(2), time(2), adjtime(3), clock_getcpuclockid(3), ctime(3), ftime(3), pthread_getcpuclockid(3), sysconf(3), time(7), vdso(7), hwclock(8)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️