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

NAME

getitimer, setitimer - 간격 타이머 κ°’ μ–»κ±°λ‚˜ μ„€μ •ν•˜κΈ°

SYNOPSIS

#include <sys/time.h>

int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
              struct itimerval *old_value);

DESCRIPTION

이 μ‹œμŠ€ν…œ ν˜ΈμΆœλ“€μ€ 간격 타이머, 즉 미래 μ–΄λŠ μ‹œμ μ— 졜초 만료되고 (μ„ νƒμ μœΌλ‘œ) 이후 주기적 κ°„κ²©μœΌλ‘œ λ§Œλ£Œλ˜λŠ” 타이머듀을 μ‚¬μš©ν•  수 있게 ν•΄ μ€€λ‹€. 타이머가 만료될 λ•Œ 호좜 ν”„λ‘œμ„ΈμŠ€μ— μ‹œκ·Έλ„μ΄ μƒμ„±λ˜κ³  (간격이 0이 μ•„λ‹ˆλ©΄) 타이머가 μ§€μ • κ°„κ²©μœΌλ‘œ μž¬μ„€μ •λœλ‹€.

μ„Έ κ°€μ§€ μ’…λ₯˜μ˜ 타이머가 μžˆμ–΄μ„œ which 인자λ₯Ό 톡해 μ§€μ •ν•œλ‹€. 각각은 μ„œλ‘œ λ‹€λ₯Έ ν΄λŸ­μ— λŒ€ν•΄ 계산을 ν•˜λ©° 타이머 만료 μ‹œ λ‹€λ₯Έ μ‹œκ·Έλ„μ„ μƒμ„±ν•œλ‹€.

ITIMER_REAL
μ‹€μ œ μ‹œκ°„(즉 λ²½μ‹œκ³„ μ‹œκ°„)으둜 타이머λ₯Ό μΉ΄μš΄νŠΈλ‹€μš΄ ν•œλ‹€. 만료 λ•Œλ§ˆλ‹€ SIGALRM μ‹œκ·Έλ„μ΄ μƒμ„±λœλ‹€.
ITIMER_VIRTUAL
ν”„λ‘œμ„ΈμŠ€κ°€ μ†Œλͺ¨ν•œ μ‚¬μš©μž λͺ¨λ“œ CPU μ‹œκ°„μ— λŒ€ν•΄ 타이머λ₯Ό μΉ΄μš΄νŠΈλ‹€μš΄ ν•œλ‹€. (ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ΄ μ†Œλͺ¨ν•œ CPU μ‹œκ°„μ΄ 츑정에 ν¬ν•¨λœλ‹€.) 만료 λ•Œλ§ˆλ‹€ SIGVTALRM μ‹œκ·Έλ„μ΄ μƒμ„±λœλ‹€.
ITIMER_PROF

ν”„λ‘œμ„ΈμŠ€κ°€ μ†Œλͺ¨ν•œ CPU μ‹œκ°„(즉 μ‚¬μš©μž μ‹œκ°„κ³Ό μ‹œμŠ€ν…œ μ‹œκ°„ λͺ¨λ‘)에 λŒ€ν•΄ 타이머λ₯Ό μΉ΄μš΄νŠΈλ‹€μš΄ ν•œλ‹€. (ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ΄ μ†Œλͺ¨ν•œ CPU μ‹œκ°„μ΄ 츑정에 ν¬ν•¨λœλ‹€.) 만료 λ•Œλ§ˆλ‹€ SIGPROF μ‹œκ·Έλ„μ΄ μƒμ„±λœλ‹€.

이 타이머λ₯Ό ITIMER_VIRTUALκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€κ°€ μ†Œλͺ¨ν•œ μ‚¬μš©μž 및 μ‹œμŠ€ν…œ CPU μ‹œκ°„μ„ ν”„λ‘œνŒŒμΌ ν•  수 μžˆλ‹€.

ν”„λ‘œμ„ΈμŠ€λŠ” μ„Έ κ°€μ§€ 타이머 μ’…λ₯˜λ³„λ‘œ ν•˜λ‚˜μ”©μ„ κ°€μ§€κ³  μžˆλ‹€.

λ‹€μŒ κ΅¬μ‘°μ²΄λ“€λ‘œ 타이머 값을 μ§€μ •ν•œλ‹€.

struct itimerval {
    struct timeval it_interval; /* μ£ΌκΈ° νƒ€μ΄λ¨Έμ˜ 간격 */
    struct timeval it_value;    /* λ‹€μŒ λ§Œλ£ŒκΉŒμ§€μ˜ μ‹œκ°„ */
};

struct timeval {
    time_t      tv_sec;         /* 초 */
    suseconds_t tv_usec;        /* 마이크둜초 */
};

getitimer()

getitimer() ν•¨μˆ˜λŠ” which둜 μ§€μ •ν•œ νƒ€μ΄λ¨Έμ˜ ν˜„μž¬ 값을 curr_valueκ°€ κ°€λ¦¬ν‚€λŠ” 버퍼에 λ„£λŠ”λ‹€.

it_value ν•˜μœ„ κ΅¬μ‘°μ²΄μ—λŠ” μ§€μ •ν•œ νƒ€μ΄λ¨Έμ˜ λ‹€μŒ 만료 λ•ŒκΉŒμ§€ 남은 μ‹œκ°„μ΄ μ±„μ›Œμ§„λ‹€. 이 값은 타이머가 μΉ΄μš΄νŠΈλ‹€μš΄ ν•˜λ©΄μ„œ λ°”λ€Œκ²Œ 되며 타이머가 만료될 λ•Œ it_interval둜 μž¬μ„€μ •λœλ‹€. it_value의 두 ν•„λ“œκ°€ λͺ¨λ‘ 0이면 이 νƒ€μ΄λ¨ΈλŠ” ν˜„μž¬ ν•΄μ œλœ (λΉ„ν™œμ„±) μƒνƒœμ΄λ‹€.

it_interval ν•˜μœ„ κ΅¬μ‘°μ²΄μ—λŠ” 타이머 간격이 μ±„μ›Œμ§„λ‹€. it_interval의 두 ν•„λ“œκ°€ λͺ¨λ‘ 0이면 이 νƒ€μ΄λ¨ΈλŠ” λ‹¨λ°œμ„±μ΄λ‹€. (즉, ν•œ 번만 λ§Œλ£Œλœλ‹€.)

setitimer()

setitimer() ν•¨μˆ˜λŠ” new_value둜 μ§€μ •ν•œ κ°’μœΌλ‘œ 타이머λ₯Ό μ„€μ •ν•˜μ—¬ which둜 μ§€μ •ν•œ 타이머λ₯Ό μž₯μ „ν•˜κ±°λ‚˜ ν•΄μ œν•œλ‹€. old_valueκ°€ NULL이 μ•„λ‹ˆλ©΄ κ·Έ 버퍼λ₯Ό μ΄μš©ν•΄ νƒ€μ΄λ¨Έμ˜ 이전 값을 (즉, getitimer()κ°€ λ°˜ν™˜ν•˜λŠ” 것과 같은 정보λ₯Ό) λ°˜ν™˜ν•œλ‹€.

new_value.it_value의 μ–΄λŠ ν•œ ν•„λ“œλΌλ„ 0이 μ•„λ‹ˆλ©΄ κ·Έ μ§€μ • μ‹œκ°„μ— 졜초 λ§Œλ£Œλ˜λ„λ‘ 타이머λ₯Ό μž₯μ „ν•œλ‹€. new_value.it_value의 두 ν•„λ“œκ°€ λͺ¨λ‘ 0이면 타이머λ₯Ό ν•΄μ œν•œλ‹€.

new_value.it_interval ν•„λ“œκ°€ νƒ€μ΄λ¨Έμ˜ μƒˆ 간격을 μ§€μ •ν•œλ‹€. κ·Έ ν•˜μœ„ ν•„λ“œκ°€ λ‘˜ λͺ¨λ‘ 0이면 타이머가 λ‹¨λ°œμ„±μ΄λ‹€.

RETURN VALUE

성곡 μ‹œ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

EFAULT
new_valueλ‚˜ old_value, curr_valueκ°€ μœ νš¨ν•œ 포인터가 μ•„λ‹ˆλ‹€.
EINVAL
whichκ°€ ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF 쀑 ν•˜λ‚˜κ°€ μ•„λ‹ˆλ‹€. λ˜λŠ” (λ¦¬λˆ…μŠ€ 2.6.22λΆ€ν„°) new_valueκ°€ κ°€λ¦¬ν‚€λŠ” ꡬ쑰체 λ‚΄μ˜ ν•œ tv_usec ν•„λ“œκ°€ 0μ—μ„œ 999999κΉŒμ§€ λ²”μœ„ λ°–μ˜ 값을 λ‹΄κ³  μžˆλ‹€.

CONFORMING TO

POSIX.1-2001, SVr4, 4.4BSD (4.2BSDμ—μ„œ 이 호좜이 처음 λ“±μž₯). POSIX.1-2008μ—μ„œλŠ” getitimer()와 setitimer()λ₯Ό κ΅¬μ‹μœΌλ‘œ ν‘œμ‹œν•˜κ³  λŒ€μ‹  POSIX 타이머 API(timer_gettime(2), timer_settime(2) λ“±) μ‚¬μš©μ„ ꢌμž₯ν•œλ‹€.

NOTES

νƒ€μ΄λ¨ΈλŠ” μš”μ²­ μ‹œκ°„ μ „μ—λŠ” μ ˆλŒ€ λ§Œλ£Œλ˜μ§€ μ•Šμ§€λ§Œ μ‹œμŠ€ν…œ 타이머 해상도와 μ‹œμŠ€ν…œ λΆ€ν•˜μ— λ”°λΌμ„œ μ•½κ°„μ˜ (짧은) μ‹œκ°„ 후에 만료될 μˆ˜λ„ μžˆλ‹€. time(7) μ°Έκ³ . (ν•˜μ§€λ§Œ μ•„λž˜ BUGSλ₯Ό 보라.) ν”„λ‘œμ„ΈμŠ€κ°€ ν™œλ™ 쀑인 λ™μ•ˆ 타이머가 만료되면 (ITIMER_VIRTUALμ—μ„œλŠ” 항상 참이닀) μ‹œκ·Έλ„μ΄ 생성 μ¦‰μ‹œ 전달될 것이닀.

fork(2)둜 μƒμ„±ν•œ μžμ‹μ΄ λΆ€λͺ¨μ˜ 간격 타이머듀을 λ¬Όλ €λ°›μ§€ μ•ŠλŠ”λ‹€. execve(2)λ₯Ό κ±°μΉ  λ•Œ 간격 타이머듀이 μœ μ§€λœλ‹€.

POSIX.1μ—μ„œλŠ” setitimer()와 μ„Έ κ°€μ§€ μΈν„°νŽ˜μ΄μŠ€ alarm(2), sleep(3), usleep(3)과의 μƒν˜Έμž‘μš©μ„ λͺ…μ„Έν•˜μ§€ μ•Šκ³  λ‚¨κ²¨λ‘μ—ˆλ‹€.

ν‘œμ€€λ“€μ—μ„œ λ‹€μŒ 호좜의 μ˜λ―Έμ— λŒ€ν•΄ μ–ΈκΈ‰ν•˜μ§€ μ•Šκ³  μžˆλ‹€.

setitimer(which, NULL, &old_value);

λŒ€λΆ€λΆ„μ˜ (μ†”λΌλ¦¬μŠ€, BSD, 그리고 μ•„λ§ˆ λ‹€λ₯Έ) μ‹œμŠ€ν…œλ“€μ—μ„œλŠ” 이λ₯Ό λ‹€μŒκ³Ό λ™λ“±ν•˜κ²Œ 닀룬닀.

getitimer(which, &old_value);

λ¦¬λˆ…μŠ€μ—μ„œλŠ” 이λ₯Ό new_value의 ν•„λ“œλ“€μ΄ 0인 호좜과 λ™λ“±ν•˜κ²Œ 닀룬닀. 즉, 타이머가 λΉ„ν™œμ„±ν™”λœλ‹€. λ¦¬λˆ…μŠ€μ˜ 이 λΉ„κΈ°λŠ₯을 μ΄μš©ν•΄μ„œλŠ” μ•ˆ λœλ‹€. 이식성이 μ—†μœΌλ©° ν•„μš”ν•œ 것도 μ•„λ‹ˆλ‹€.

BUGS

μ‹œκ·Έλ„μ˜ 생성과 전달은 μ„œλ‘œ λ³„κ°œμ΄λ©° ν”„λ‘œμ„ΈμŠ€λ³„λ‘œ μœ„μ— λ‚˜μ—΄λœ μ‹œκ·Έλ„λ“€λ§ˆλ‹€ ν•œ μΈμŠ€ν„΄μŠ€λ§Œ 미처리 μƒνƒœμΌ 수 μžˆλ‹€. μ•„μ£Ό 높은 λΆ€ν•˜μ—μ„œλŠ” μ•žμ„  λ§Œλ£Œμ—μ„œμ˜ μ‹œκ·Έλ„μ΄ μ „λ‹¬λ˜κΈ° 전에 ITIMER_REAL 타이머가 λ‹€μ‹œ 만료될 μˆ˜λ„ μžˆλ‹€. 그런 경우 두 번째 μ‹œκ·Έλ„μ€ μœ μ‹€λ˜κ²Œ λœλ‹€.

λ¦¬λˆ…μŠ€ 컀널 2.6.16 μ „μ—μ„œλŠ” 타이머 값듀을 μ§€ν”Όλ‘œ ν‘œν˜„ν•œλ‹€. μ§€ν”Όλ‘œ ν‘œν˜„ν•˜λ©΄ (include/linux/jiffies.h에 μ •μ˜λœ) MAX_SEC_IN_JIFFIESλ₯Ό μ΄ˆκ³Όν•˜λŠ” κ°’μœΌλ‘œ 타이머λ₯Ό μ„€μ •ν•˜λ„λ‘ μš”μ²­ν•˜λ©΄ μ‘°μš©ν•˜κ²Œ 타이머λ₯Ό κ·Έ μƒν•œ κ°’μœΌλ‘œ μž˜λΌλ‚Έλ‹€. (λ¦¬λˆ…μŠ€ 2.6.13λΆ€ν„° κΈ°λ³Έ μ§€ν”Όκ°€ 0.004초인) λ¦¬λˆ…μŠ€/i386μ—μ„œλΌλ©΄ νƒ€μ΄λ¨Έμ˜ μƒν•œκ°’μ΄ μ•½ 99.42μΌμ΄λΌλŠ” λœ»μ΄λ‹€. λ¦¬λˆ…μŠ€ 2.6.16λΆ€ν„°λŠ” μ»€λ„μ—μ„œ μ‹œκ°„μ— λŒ€ν•΄ λ‹€λ₯Έ λ‚΄λΆ€ ν‘œν˜„μ„ μ‚¬μš©ν•˜λ―€λ‘œ 이런 μƒν•œμ΄ μ—†λ‹€.

νŠΉμ • μ‹œμŠ€ν…œλ“€(i386 포함)μ—μ„œ 버전 2.6.12 μ „μ˜ λ¦¬λˆ…μŠ€ μ»€λ„μ—λŠ” 일뢀 μƒν™©μ—μ„œ ν•œ μ§€ν”ΌκΉŒμ§€ 이λ₯΄κ²Œ 타이머 λ§Œλ£Œκ°€ μΌμ–΄λ‚˜λŠ” 버그가 μžˆλ‹€. 컀널 2.6.12μ—μ„œ 이 버그가 μˆ˜μ •λ˜μ—ˆλ‹€.

POSIX.1-2001μ—μ„œλŠ” tv_usec 값을 0μ—μ„œ 999999κΉŒμ§€ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ²Œ μ§€μ •ν•œ 경우 setitimer()κ°€ μ‹€νŒ¨ν•΄μ•Ό ν•œλ‹€κ³  ν•œλ‹€. ν•˜μ§€λ§Œ 2.6.21κΉŒμ§€ μ»€λ„μ—μ„œ λ¦¬λˆ…μŠ€λŠ” 였λ₯˜λ₯Ό μ£Όμ§€ μ•Šκ³  κ·Έ λŒ€μ‹  μ‘°μš©ν•˜κ²Œ νƒ€μ΄λ¨Έμ˜ λŒ€μ‘ν•˜λŠ” 초 값을 μ‘°μ •ν•œλ‹€. 컀널 2.6.22λΆ€ν„°λŠ” 이런 λΉ„μ€€μˆ˜ 사항이 κ³ μ³μ Έμ„œ 잘λͺ»λœ tv_usec 값이 EINVAL 였λ₯˜λ₯Ό μœ λ°œν•œλ‹€.

SEE ALSO

gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7)


2017-09-15

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