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

NAME

nanosleep - 고해상도 sleep

SYNOPSIS

#include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

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

nanosleep()
_POSIX_C_SOURCE >= 199309L

DESCRIPTION

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

호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜λŠ” κ²½μš°μ—λŠ” nanosleep()이 -1을 λ°˜ν™˜ν•˜κ³  errnoλ₯Ό EINTR둜 μ„€μ •ν•˜λ©° rem이 NULL이 μ•„λ‹ˆλ©΄ 남은 μ‹œκ°„μ„ rem이 κ°€λ¦¬ν‚€λŠ” ꡬ쑰체에 써 λ„£λŠ”λ‹€. 그러면 *rem의 κ°’μœΌλ‘œ λ‹€μ‹œ nanosleep()을 ν˜ΈμΆœν•΄μ„œ μ§€μ •ν–ˆλ˜ 쀑지 μ‹œκ°„μ„ μ±„μšΈ 수 μžˆλ‹€. (ν•˜μ§€λ§Œ NOTES μ°Έκ³ .)

timespec ꡬ쑰체λ₯Ό μ‚¬μš©ν•΄ λ‚˜λ…Έμ΄ˆ μ •λ°€λ„λ‘œ μ‹œκ°„μ„ μ§€μ •ν•œλ‹€. ꡬ쑰체가 λ‹€μŒκ³Ό 같이 μ •μ˜λΌ μžˆλ‹€.

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

λ‚˜λ…Έμ΄ˆ ν•„λ“œμ˜ 값은 0μ—μ„œ 999999999 사이 λ²”μœ„μ—¬μ•Ό ν•œλ‹€.

sleep(3) 및 usleep(3)κ³Ό 비ꡐ할 λ•Œ nanosleep()μ—λŠ” λͺ‡ κ°€μ§€ 강점이 μžˆλ‹€. μž λ“œλŠ” μ‹œκ°„μ„ 높은 ν•΄μƒλ„λ‘œ μ§€μ •ν•  수 있고, POSIX.1μ—μ„œ 이 ν•¨μˆ˜κ°€ μ‹œκ·Έλ„κ³Ό μƒν˜Έμž‘μš©ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  λͺ…ν™•νžˆ λͺ…μ„Έν•˜κ³  있으며, μ‹œκ·Έλ„ ν•Έλ“€λŸ¬λ‘œ μ€‘λ‹¨λœ μž λ“€κΈ°λ₯Ό μž¬κ°œν•˜λŠ” 일이 μ‰¬μ›Œμ§„λ‹€.

RETURN VALUE

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

ERRORS

EFAULT
μ‚¬μš©μž κ³΅κ°„μœΌλ‘œλΆ€ν„° 정보λ₯Ό λ³΅μ‚¬ν•˜λ©΄μ„œ 문제 λ°œμƒ.
EINTR
μŠ€λ ˆλ“œλ‘œ μ „λ‹¬λœ μ‹œκ·Έλ„μ— μ˜ν•΄ νœ΄μ§€κ°€ μ€‘λ‹¨λ˜μ—ˆλ‹€. (signal(7) μ°Έκ³ .) λ‚¨λŠ” μ‹œκ°„μ΄ *rem에 κΈ°λ‘λ˜μ—ˆμœΌλ―€λ‘œ μŠ€λ ˆλ“œμ—μ„œ λ°”λ‘œ nanosleep()을 λ‹€μ‹œ ν˜ΈμΆœν•΄μ„œ νœ΄μ§€λ₯Ό μ΄μ–΄κ°ˆ 수 μžˆλ‹€.
EINVAL
tv_nsec ν•„λ“œμ˜ 값이 0μ—μ„œ 999999999κΉŒμ§€ λ²”μœ„ μ•ˆμ΄ μ•„λ‹ˆκ±°λ‚˜ tv_sec이 μŒμˆ˜μ΄λ‹€.

CONFORMING TO

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

NOTES

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

nanosleep()이 μƒλŒ€μ  μ‹œκ°„ λ™μ•ˆ μž λ“ λ‹€λŠ” 점이 μ‹œκ·Έλ„ λ•Œλ¬Έμ— λ°˜λ³΅ν•΄μ„œ 호좜이 μž¬μ‹œμž‘λ˜λŠ” 경우 λ¬Έμ œκ°€ 될 수 μžˆλ‹€. 호좜 쀑단과 μž¬μ‹œμž‘ μ‚¬μ΄μ˜ μ‹œκ°„ λ•Œλ¬Έμ— μž λ“€κΈ°κ°€ μ΅œμ’…μ μœΌλ‘œ λλ‚˜λŠ” μ‹œμ μ΄ λŠ¦μΆ°μ§€κ²Œ 되기 λ•Œλ¬Έμ΄λ‹€. clock_nanosleep(2)을 μ ˆλŒ€ μ‹œκ°„ κ°’μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ 이 문제λ₯Ό ν”Όν•  수 μžˆλ‹€.

POSIX.1μ—μ„œλŠ” nanosleep()이 CLOCK_REALTIME ν΄λŸ­μ— 따라 μ‹œκ°„μ„ μž¬μ•Ό ν•œλ‹€κ³  λͺ…μ„Έν•œλ‹€. ν•˜μ§€λ§Œ λ¦¬λˆ…μŠ€μ—μ„œλŠ” CLOCK_MONOTONIC 클럭으둜 μ‹œκ°„μ„ μž°λ‹€. 이게 μ€‘μš”μΉ˜ μ•Šμ„ μˆ˜λ„ μžˆλŠ” 것이, POSIX.1의 clock_settime(2) λͺ…μ„Έμ—μ„œλŠ” CLOCK_REALTIME의 λΆˆμ—°μ†μ  변경이 nanosleep()에 영ν–₯을 λΌμΉ˜μ§€ 말아야 ν•œλ‹€κ³  λ§ν•œλ‹€.

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

ꡬ식 λ™μž‘ 방식

(κ°€λ Ή μ–΄λ–€ μ‹œκ°„ μ œμ•½μ  ν•˜λ“œμ›¨μ–΄λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄) 훨씬 더 μ •λ°€ν•œ νœ΄μ§€κ°€ ν•„μš”ν•œ μ‘μš©μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄μ„œ SCHED_FIFOλ‚˜ SCHED_RR 같은 μ‹€μ‹œκ°„ μ •μ±…μœΌλ‘œ μŠ€μΌ€μ€„λ§ 된 μŠ€λ ˆλ“œμ—μ„œ nanosleep()을 ν˜ΈμΆœν•œ 경우 2λ°€λ¦¬μ΄ˆκΉŒμ§€μ˜ νœ΄μ§€λŠ” λ°”μœ λŒ€κΈ°λ₯Ό 톡해 마이크둜초 μ •λ°€λ„λ‘œ μ²˜λ¦¬ν•˜μ˜€λ‹€. 이 νŠΉμˆ˜ν•œ ν™•μž₯ λ™μž‘μ€ 컀널 2.5.39μ—μ„œ μ œκ±°λ˜μ—ˆμœΌλ―€λ‘œ λ¦¬λˆ…μŠ€ 2.6.0 및 이후 μ»€λ„μ—μ„œλŠ” μ΄μš©ν•  수 μ—†λ‹€.

BUGS

μ‹œκ·Έλ„μ„ 작으며 nanosleep()을 μ΄μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ μ•„μ£Ό 높은 λΉˆλ„λ‘œ μ‹œκ·Έλ„μ„ λ°›λŠ” κ²½μš°μ—λŠ” μŠ€μΌ€μ€„λ§ μ§€μ—°κ³Ό μ»€λ„μ˜ 수면 μ‹œκ°„ 및 λ°˜ν™˜ν•  remain κ°’ 계산 였차 λ•Œλ¬Έμ— nanosleep() 호좜 μž¬μ‹œμž‘μ΄ μ΄μ–΄μ§€λ©΄μ„œ remain 값이 천천히 증가할 μˆ˜λ„ μžˆλ‹€. 그런 문제λ₯Ό ν”Όν•˜λ €λ©΄ clock_nanosleep(2)을 TIMER_ABSTIME ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ μ‚¬μš©ν•΄μ„œ μ ˆλŒ€μ  μ‹œμ κΉŒμ§€ μž λ“€λ©΄ λœλ‹€.

λ¦¬λˆ…μŠ€ 2.4μ—μ„œλŠ” nanosleep()이 μ‹œκ·Έλ„(κ°€λ Ή SIGTSTP)에 μ˜ν•΄ μ •μ§€λ˜λ©΄ SIGCONT μ‹œκ·Έλ„λ‘œ μŠ€λ ˆλ“œκ°€ 재개된 후에 호좜이 EINTR 였λ₯˜λ‘œ μ‹€νŒ¨ν•œλ‹€. 이후 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μž¬μ‹œμž‘ν•˜λŠ” κ²½μš°μ—λŠ” μŠ€λ ˆλ“œκ°€ μ •μ§€λœ μƒνƒœμ—μ„œ 보낸 μ‹œκ°„μ΄ μž λ“  μ‹œκ°„μ— κ³„μ‚°λ˜μ§€ μ•ŠλŠ”λ‹€. λ¦¬λˆ…μŠ€ 2.6.0 및 이후 μ»€λ„μ—λŠ” 이 λ¬Έμ œκ°€ 고쳐져 μžˆλ‹€.

SEE ALSO

clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), usleep(3), time(7)


2017-09-15

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