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

NAME

clock_nanosleep - 클럭 지정이 κ°€λŠ₯ν•œ 고해상도 sleep

SYNOPSIS

#include <time.h>

int clock_nanosleep(clockid_t clock_id, int flags,
                    const struct timespec *request,
                    struct timespec *remain);

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

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

clock_nanosleep()
_POSIX_C_SOURCE >= 200112L

DESCRIPTION

nanosleep(2)κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ clock_nanosleep()을 톡해 호좜 μŠ€λ ˆλ“œκ°€ λ‚˜λ…Έμ΄ˆ μ •λ°€λ„λ‘œ μ§€μ •ν•œ μ‹œκ°„ λ™μ•ˆ μž λ“€ 수 μžˆλ‹€. 차이점은 수면 μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” ν΄λŸ­μ„ ν˜ΈμΆœμžκ°€ 선택할 수 μžˆλ‹€λŠ” 점과 수면 μ‹œκ°„μ„ μ ˆλŒ“κ°’μ΄λ‚˜ μƒλŒ“κ°’μœΌλ‘œ μ§€μ •ν•  수 μžˆλ‹€λŠ” 점이닀.

이 호좜둜 μ£Όκ±°λ‚˜ λŒλ €λ°›λŠ” μ‹œκ°„ 값듀은 λ‹€μŒκ³Ό 같이 μ •μ˜λœ timespec ꡬ쑰체둜 λ‚˜νƒ€λ‚Έλ‹€.

struct timespec {
    time_t   tv_sec;        /* 초 */
    long     tv_nsec;       /* λ‚˜λ…Έμ΄ˆ ([0 .. 999999999] */
};

clock_id μΈμžλŠ” μž λ“œλŠ” μ‹œκ°„μ„ μΈ‘μ •ν•  ν΄λŸ­μ„ λ‚˜νƒ€λ‚Έλ‹€. λ‹€μŒ κ°’λ“€ 쀑 ν•˜λ‚˜λ₯Ό 이 μΈμžμ— μ“Έ 수 μžˆλ‹€.

CLOCK_REALTIME
μ„€μ • κ°€λŠ₯ν•œ μ‹œμŠ€ν…œ μ „μ—­ μ‹€μ œ μ‹œκ°„ 클럭.
CLOCK_MONOTONIC
μ‹œμŠ€ν…œ μ‹œλ™ ν›„ λ°”λ€Œμ§€ μ•ŠλŠ” κ³Όκ±° μ–΄λ–€ λΆˆνŠΉμ • μ‹œμ λΆ€ν„°μ˜ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” μ„€μ • λΆˆκ°€λŠ₯ν•œ 단쑰 증가 클럭.
CLOCK_PROCESS_CPUTIME_ID (λ¦¬λˆ…μŠ€ 2.6.12λΆ€ν„°.)
ν”„λ‘œμ„ΈμŠ€μ˜ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ μ†Œλͺ¨ν•œ CPU μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” μ„€μ • κ°€λŠ₯ν•œ ν”„λ‘œμ„ΈμŠ€λ³„ 클럭.

이 ν΄λŸ­λ“€μ— λŒ€ν•œ 더 μžμ„Έν•œ λ‚΄μš©μ€ clock_getres(2)λ₯Ό 보라. λ˜ν•œ clock_getcpuclockid(3) 및 pthread_getcpuclockid(3)κ°€ λ°˜ν™˜ν•œ CPU 클럭 ID도 clock_id에 쀄 수 μžˆλ‹€.

flagsκ°€ 0이면 request에 μ§€μ •ν•œ 값을 clock_id에 μ§€μ •ν•œ 클럭의 ν˜„μž¬ 값에 λŒ€ν•œ μƒλŒ€μ  μ‹œκ°„μœΌλ‘œ ν•΄μ„ν•œλ‹€.

flagsκ°€ TIMER_ABSTIME이면 requestλ₯Ό clock_id 클럭으둜 μΈ‘μ •ν•œ μ ˆλŒ€ μ‹œκ°„μœΌλ‘œ ν•΄μ„ν•œλ‹€. requestκ°€ 클럭의 ν˜„μž¬ 값보닀 μž‘κ±°λ‚˜ κ°’μœΌλ©΄ 호좜 μŠ€λ ˆλ“œκ°€ λ©ˆμΆ”μ§€ μ•Šκ³  clock_nanosleep()이 μ¦‰μ‹œ λ°˜ν™˜ν•œλ‹€.

clock_nanosleep()은 적어도 request에 μ§€μ •ν•œ μ‹œκ°„μ΄ μ§€λ‚  λ•ŒκΉŒμ§€, λ˜λŠ” ν•Έλ“€λŸ¬ ν˜ΈμΆœμ„ μœ λ°œν•˜κ±°λ‚˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œμ‹œν‚€λŠ” μ‹œκ·Έλ„μ΄ 전달될 λ•ŒκΉŒμ§€ 호좜 μŠ€λ ˆλ“œμ˜ 싀행을 λ©ˆμΆ˜λ‹€.

호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜λŠ” κ²½μš°μ—λŠ” clock_nanosleep()이 EINTR 였λ₯˜λ‘œ μ‹€νŒ¨ν•œλ‹€. λ”λΆˆμ–΄ remain이 NULL이 μ•„λ‹ˆκ³  flagsκ°€ TIMER_ABSTIME이 μ•„λ‹ˆμ—ˆμœΌλ©΄ 남은 수면 μ‹œκ°„μ„ remain으둜 λ°˜ν™˜ν•œλ‹€. 그러면 이 κ°’μœΌλ‘œ λ‹€μ‹œ clock_nanosleep()을 ν˜ΈμΆœν•΄μ„œ (μƒλŒ€μ ) μˆ˜λ©΄μ„ 끝마칠 수 μžˆλ‹€.

RETURN VALUE

μš”μ²­ μ‹œκ°„ λ™μ•ˆ μ„±κ³΅μ μœΌλ‘œ μž λ“  경우 clock_nanosleep()은 0을 λ°˜ν™˜ν•œλ‹€. 호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜κ±°λ‚˜ 였λ₯˜λ₯Ό λ§Œλ‚œ κ²½μš°μ—λŠ” ERRORS에 λ‚˜μ—΄λœ μ–‘μˆ˜ 였λ₯˜ λ²ˆν˜Έλ“€ 쀑 ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•œλ‹€.

ERRORS

EFAULT
μ§€μ •ν•œ requestλ‚˜ remain이 μœ νš¨ν•˜μ§€ μ•Šμ€ μ£Όμ†Œμ΄λ‹€.
EINTR
μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μž λ“€κΈ°κ°€ μ€‘λ‹¨λ˜μ—ˆλ‹€. signal(7) μ°Έκ³ .
EINVAL
tv_nsec ν•„λ“œμ˜ 값이 0μ—μ„œ 999999999κΉŒμ§€ λ²”μœ„ μ•ˆμ΄ μ•„λ‹ˆκ±°λ‚˜ tv_sec이 μŒμˆ˜μ΄λ‹€.
EINVAL
clock_idκ°€ μœ νš¨ν•˜μ§€ μ•Šλ‹€. (CLOCK_THREAD_CPUTIME_IDλŠ” clock_id에 κ°€λŠ₯ν•œ 값이 μ•„λ‹ˆλ‹€.)

VERSIONS

λ¦¬λˆ…μŠ€ 2.6μ—μ„œ clock_nanosleep() μ‹œμŠ€ν…œ 호좜이 처음 λ“±μž₯ν–ˆλ‹€. glibc 버전 2.1λΆ€ν„° 지원을 μ“Έ 수 μžˆλ‹€.

CONFORMING TO

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

NOTES

request에 μ§€μ •ν•œ μ‹œκ°„μ΄ 기반 클럭 정밀도(time(7) μ°Έκ³ )의 μ •μˆ˜λ°°κ°€ μ•„λ‹ˆλ©΄ λ‹€μŒ 배수둜 μ‹œκ°„μ„ 올림 ν•œλ‹€. λ˜ν•œ μž λ“€κΈ°κ°€ λλ‚œ 후에도 CPUμ—μ„œ 호좜 μŠ€λ ˆλ“œλ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•  수 있게 될 λ•ŒκΉŒμ§€ 지연이 μžˆμ„ μˆ˜λ„ μžˆλ‹€.

μ ˆλŒ€ 타이머λ₯Ό μ“°λ©΄ nanosleep(2)μ—μ„œ μ„€λͺ…ν•˜λŠ” λŠ¦μΆ°μ§€λŠ” 문제λ₯Ό λ§‰λŠ” 데 도움이 λœλ‹€. (μƒλŒ€μ  μž λ“€κΈ°κ°€ 반볡적으둜 μ‹œκ·Έλ„μ— μ˜ν•΄ μ€‘λ‹¨λΌμ„œ μž¬μ‹œμž‘ν•˜λ € ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ κ·Έ λ¬Έμ œκ°€ 심해진닀.) μƒλŒ€μ  μž λ“€κΈ°λ₯Ό ν•˜λ©΄μ„œ 이 문제λ₯Ό ν”Όν•˜λ €λ©΄ μ›ν•˜λŠ” 클럭으둜 clock_gettime(2)을 ν˜ΈμΆœν•˜κ³ μ„œ TIMER_ABSTIME ν”Œλž˜κ·Έλ‘œ clock_nanosleep()을 ν˜ΈμΆœν•˜λ©΄ λœλ‹€.

clock_nanosleep()은 sigaction(2) SA_RESTART ν”Œλž˜κ·Έλ₯Ό 쓰더라도 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λœ ν›„ μ ˆλŒ€ μž¬μ‹œμž‘λ˜μ§€ μ•ŠλŠ”λ‹€.

flagsκ°€ TIMER_ABSTIME일 λ•ŒλŠ” remain 인자λ₯Ό μ•ˆ μ“°λ©° ν•„μš”λ„ μ—†λ‹€. (μ ˆλŒ€ μ‹œκ°„ μž λ“€κΈ°λŠ” 같은 request 인자λ₯Ό μ¨μ„œ μž¬μ‹œμž‘ν•  수 μžˆλ‹€.)

POSIX.1μ—μ„œλŠ” clock_nanosleep()이 μ‹œκ·Έλ„ 처리 λ°©μ‹μ΄λ‚˜ μ‹œκ·Έλ„ λ§ˆμŠ€ν¬μ— μ–΄λ–€ 영ν–₯도 λΌμΉ˜μ§€ μ•ŠλŠ”λ‹€κ³  λͺ…μ„Έν•œλ‹€.

POSIX.1μ—μ„œλŠ” clock_settime(2)을 톡해 CLOCK_REALTIME의 값을 λ°”κΎΌ ν›„μ—λŠ” μ ˆλŒ€μ  clock_nanosleep()에 블둝 된 μŠ€λ ˆλ“œκ°€ κΉ¨μ–΄λ‚  μ‹œμ μ„ μƒˆ 클럭 κ°’μœΌλ‘œ μ •ν•΄μ•Ό ν•œλ‹€κ³  λͺ…μ„Έν•˜κ³  μžˆλ‹€. μƒˆ 클럭 값이 수면 μ‹œκ°„ 끝을 λ„˜μ–΄κ°„λ‹€λ©΄ clock_nanosleep() 호좜이 μ¦‰μ‹œ λ°˜ν™˜λœλ‹€.

POSIX.1μ—μ„œλŠ” clock_settime(2)을 톡해 CLOCK_REALTIME의 값을 λ°”κΎΈλŠ” 것이 μƒλŒ€μ  clock_nanosleep()에 블둝 된 μŠ€λ ˆλ“œμ— μ–΄λ–€ 영ν–₯도 λΌμΉ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€κ³  λͺ…μ„Έν•˜κ³  μžˆλ‹€.

SEE ALSO

clock_getres(2), nanosleep(2), restart_syscall(2), timer_create(2), sleep(3), usleep(3), time(7)


2017-09-15

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