timerfd_create(2) - wariua/manpages-ko GitHub Wiki
timerfd_create, timerfd_settime, timerfd_gettime - νμΌ λμ€ν¬λ¦½ν°λ₯Ό ν΅ν΄ μλ € μ£Όλ νμ΄λ¨Έ
#include <sys/timerfd.h>
int timerfd_create(int clockid, int flags);
int timerfd_settime(int fd, int flags,
const struct itimerspec *new_value,
struct itimerspec *old_value);
int timerfd_gettime(int fd, struct itimerspec *curr_value);
μ΄ μμ€ν νΈμΆλ€μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό ν΅ν΄ νμ΄λ¨Έ λ§λ£ μλ¦Όμ μ λ¬νλ νμ΄λ¨Έλ₯Ό μμ±νκ³ μ‘°μνλ€. setitimer(2)λ timer_create(2)μ λμμ΄ λμ΄ μ£Όλλ° select(2), poll(2), epoll(7)λ‘ κ·Έ νμΌ λμ€ν¬λ¦½ν°λ₯Ό κ°μν μ μλ€λ μ₯μ μ΄ μλ€.
μ΄ μΈ κ°μ§ μμ€ν
νΈμΆ μ¬μ©λ²μ timer_create(2), timer_settime(2), timer_gettime(2)κ³Ό λΉμ·νλ€. (timer_getoverrun(2)μ λμνλ κ²μ μλ€. μλμμ μ€λͺ
νλ― read(2)
λ‘ κ·Έ κΈ°λ₯μ±μ μ 곡νκΈ° λλ¬Έμ΄λ€.)
timerfd_create()
λ μ νμ΄λ¨Έ κ°μ²΄λ₯Ό μμ±νκ³ κ·Έ νμ΄λ¨Έλ₯Ό κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°ννλ€. clockid
μΈμλ νμ΄λ¨Έ μ§νμ νΉμ§ μ§λ ν΄λμ λνλ΄λ©° λ€μ μ€ ν κ°μ§μ¬μΌ νλ€.
CLOCK_REALTIME
- μ€μ κ°λ₯νλ©° μμ€ν μ μμΈ μ€μ μκ° ν΄λ.
CLOCK_MONOTONIC
- μ€μ λΆκ°λ₯νλ©° μμ€ν ꡬλ ν λ°λμ§ μλ κ³Όκ±° λΆνΉμ μμ μΌλ‘λΆν°μ μκ°μ μΈ‘μ νλ λ¨μ‘° μ¦κ° ν΄λ.
-
CLOCK_BOOTTIME
(리λ μ€ 3.15λΆν°) -
CLOCK_MONOTONIC
μ²λΌ λ¨μ‘° μ¦κ°νλ ν΄λμ΄λ€. νμ§λ§CLOCK_MONOTONIC
ν΄λμμ μμ€ν μ΄ μ μ λκΈ° μνμΈ μκ°μ μΈ‘μ νμ§ μλ λ°λ©΄CLOCK_BOOTTIME
ν΄λμμλ μμ€ν μ΄ μ μ λκΈ° μνμΈ μκ°μ ν¬ν¨νλ€. μ μ λκΈ°λ₯Ό μΈμν νμκ° μλ μμ©λ€μ μ μ©νλ€. κ·Έλ° μμ©λ€μCLOCK_REALTIME
μ μ ν©νμ§ μμλ°, κ·Έ ν΄λμ μμ€ν ν΄λμ λΆμ°μμ λ³νμ μν₯μ λ°κΈ° λλ¬Έμ΄λ€. -
CLOCK_REALTIME_ALARM
(리λ μ€ 3.11λΆν°) - μ΄ ν΄λμ
CLOCK_REALTIME
κ³Ό λΉμ·νλ μμ€ν μ΄ μ μ λκΈ° μνμ΄λ©΄ κΉ¨μ°κ² λλ€. μ΄ ν΄λμ λν΄ νμ΄λ¨Έλ₯Ό μ€μ νκΈ° μν΄μ νΈμΆμκ°CAP_WAKE_ALARM
μλ₯μ κ°μ§κ³ μμ΄μΌ νλ€. -
CLOCK_BOOTTIME_ALARM
(리λ μ€ 3.11λΆν°) - μ΄ ν΄λμ
CLOCK_BOOTTIME
κ³Ό λΉμ·νλ μμ€ν μ΄ μ μ λκΈ° μνμ΄λ©΄ κΉ¨μ°κ² λλ€. μ΄ ν΄λμ λν΄ νμ΄λ¨Έλ₯Ό μ€μ νκΈ° μν΄μ νΈμΆμκ°CAP_WAKE_ALARM
μλ₯μ κ°μ§κ³ μμ΄μΌ νλ€.
μ΄ ν΄λλ€ κ°κ°μ νμ¬ κ°μ clock_gettime(2)μ μ΄μ©ν΄ μ»μ΄ μ¬ μ μλ€.
리λ
μ€ 2.6.27λΆν° flags
μ λ€μ κ°λ€μ λΉνΈ OR ν΄μ timerfd_create()
μ λμ λ°©μμ λ°κΏ μ μλ€.
TFD_NONBLOCK
- μ νμΌ λμ€ν¬λ¦½ν°κ° κ°λ¦¬ν€λ μ΄λ¦° νμΌ κΈ°μ νλͺ©(open(2) μ°Έκ³ )μ
O_NONBLOCK
νμΌ μν νλκ·Έλ₯Ό μ€μ νλ€. μ΄ νλκ·Έλ₯Ό μ¬μ©νλ©΄ κ°μ κ²°κ³Όλ₯Ό μ»κΈ° μν΄ fcntl(2)μ μΆκ°λ‘ νΈμΆνμ§ μμλ λλ€. TFD_CLOEXEC
- μ νμΌ λμ€ν¬λ¦½ν°μ 'execμμ λ«κΈ°'(
FD_CLOEXEC
) νλκ·Έλ₯Ό μ€μ νλ€. μ΄κ² μ μ©ν μ μλ μ΄μ μ λν΄μ open(2)μO_CLOEXEC
νλκ·Έ μ€λͺ μ 보λΌ.
리λ
μ€ λ²μ 2.6.26κΉμ§μμλ flags
λ₯Ό 0μΌλ‘ μ§μ ν΄μΌ νλ€.
timerfd_settime()
μ νμΌ λμ€ν¬λ¦½ν° fd
κ° κ°λ¦¬ν€λ νμ΄λ¨Έλ₯Ό μ₯μ (μμ)νκ±°λ ν΄μ (μ μ§)νλ€.
new_value
μΈμλ νμ΄λ¨Έμ μ΅μ΄ λ§λ£ μκ°κ³Ό κ°κ²©μ μ§μ νλ€. μ΄ μΈμμ μ°λ itimerspec
ꡬ쑰체μλ λ νλκ° μκ³ κ°κ°μ΄ λ€μ timespec
νμ
ꡬ쑰체μ΄λ€.
struct timespec {
time_t tv_sec; /* μ΄ */
long tv_nsec; /* λλ
Έμ΄ */
};
struct itimerspec {
struct timespec it_interval; /* μ£ΌκΈ° νμ΄λ¨Έμ κ°κ²© */
struct timespec it_value; /* μ΅μ΄ λ§λ£ */
};
new_value.it_value
λ νμ΄λ¨Έμ μ΅μ΄ λ§λ£ μκ°μ μ΄μ λλ
Έμ΄λ‘ μ§μ νλ€. new_value.it_value
μ ν νλλΌλ 0 μλ κ°μΌλ‘ μ€μ νλ©΄ νμ΄λ¨Έκ° μ₯μ λλ€. new_value.it_value
μ λ νλλ₯Ό λͺ¨λ 0μΌλ‘ μ€μ νλ©΄ νμ΄λ¨Έλ₯Ό ν΄μ νλ€.
new_value.it_interval
μ νλ ν κ°λ λ κ°λ₯Ό 0 μλ κ°μΌλ‘ μ€μ νλ©΄ μ΅μ΄ λ§λ£ ν νμ΄λ¨Έμ λ°λ³΅ λ§λ£ μ£ΌκΈ°λ₯Ό μ΄μ λλ
Έμ΄λ‘ μ§μ νλ€. new_value.it_interval
μ λ νλκ° λͺ¨λ 0μ΄λ©΄ new_value.it_value
λ‘ μ§μ ν μκ°μ ν λ²λ§ νμ΄λ¨Έκ° λ§λ£λλ€.
κΈ°λ³Έμ μΌλ‘ new_value
λ‘ μ§μ νλ μ΅μ΄ λ§λ£ μκ°μ νΈμΆ μμ μ νμ΄λ¨Έ ν΄λμ νμ¬ μκ°μ κΈ°μ€μΌλ‘ μλμ μΌλ‘ ν΄μνλ€. (μ¦, new_value.it_value
κ° μ§μ νλ κ²μ΄ clockid
λ‘ μ§μ ν ν΄λμ νμ¬ κ°μ λν μλμ μκ°μ΄λ€.) flags
μΈμλ₯Ό ν΅ν΄ μ λ μκ° νμμμμ μ νν μ μλ€.
flags
μΈμλ λΉνΈ λ§μ€ν¬μ΄λ©° λ€μ κ°λ€μ ν¬ν¨ν μ μλ€.
TFD_TIMER_ABSTIME
-
new_value.it_value
λ₯Ό νμ΄λ¨Έ ν΄λμμμ μ λκ°μΌλ‘ ν΄μνλ€. νμ΄λ¨Έμ ν΄λμ΄new_value.it_value
λ‘ μ§μ ν κ°μ λλ¬ν λ νμ΄λ¨Έκ° λ§λ£λλ€. TFD_TIMER_CANCEL_ON_SET
-
TFD_TIMER_ABSTIME
κ³Ό ν¨κ» μ΄ νλκ·Έλ₯Ό μ§μ νκ³ μ΄ νμ΄λ¨Έμ ν΄λμ΄CLOCK_REALTIME
μ΄λCLOCK_REALTIME_ALARM
μ΄λ©΄ μ€μ μκ° ν΄λμ΄ λΆμ°μμ λ³κ²½(settimeofday(2)λ clock_settime(2) κ°μ κ²)μ κ²ͺμ λ μ΄ νμ΄λ¨Έλ₯Ό μ·¨μν μ μλ€κ³ νμνλ€. κ·Έλ° λ³κ²½μ΄ μΌμ΄λ λ νμΌ λμ€ν¬λ¦½ν°μ λν νμ¬λ λ―Έλμread(2)
κ°ECANCELED
μ€λ₯λ‘ μ€ν¨νκ² λλ€.
old_value
μΈμκ° NULLμ΄ μλλ©΄ κ°λ¦¬ν€λ itimerspec
ꡬ쑰체λ₯Ό μ΄μ©ν΄ νΈμΆ μμ μ μ μ© μ€μ΄λ νμ΄λ¨Έ μ€μ μ λ°ννλ€. μ΄μ΄μ§λ timerfd_gettime()
μ€λͺ
μ μ°Έκ³ νλΌ.
timerfd_gettime()
μ νμΌ λμ€ν¬λ¦½ν° fd
κ° κ°λ¦¬ν€λ νμ΄λ¨Έμ νμ¬ μ€μ μ λ΄μ itimerspec
ꡬ쑰체λ₯Ό curr_value
λ‘ λ°ννλ€.
it_value
νλλ νμ΄λ¨Έκ° λ€μ λ§λ£λ λκΉμ§ λ¨μ μκ°μ λ°ννλ€. μ΄ κ΅¬μ‘°μ²΄μ λ νλκ° λͺ¨λ 0μ΄λΌλ©΄ νμ΄λ¨Έκ° νμ¬ ν΄μ λμ΄ μλ κ²μ΄λ€. νμ΄λ¨Έλ₯Ό μ€μ ν λ TFD_TIMER_ABSTIME
νλκ·Έλ₯Ό μ§μ νλμ§μ 무κ΄νκ² μ΄ νλλ νμ μλκ°μ λ΄κ³ μλ€.
it_interval
νλλ νμ΄λ¨Έμ κ°κ²©μ λ°ννλ€. μ΄ κ΅¬μ‘°μ²΄μ λ νλκ° λͺ¨λ 0μ΄λΌλ©΄ curr_value.it_value
λ‘ μ§μ ν μκ°μ ν λ²λ§ λ§λ£λλλ‘ νμ΄λ¨Έκ° μ€μ λμ΄ μλ κ²μ΄λ€.
timerfd_create()
κ° λ°ννλ νμΌ λμ€ν¬λ¦½ν°λ λ€μ μμ
μ μ§μνλ€.
read(2)
-
timerfd_settime()
μ μ΄μ©ν΄ λ§μ§λ§μΌλ‘ μ€μ μ λ³κ²½ν μ΄νλ‘, λλ λ§μ§λ§read(2)
μ±κ³΅ μ΄νλ‘ νμ΄λ¨Έκ° ν λ² μ΄μ λ§λ£λμμΌλ©΄ λ°μν λ§λ£ νμλ₯Ό λ΄μ λΆνΈ μλ 8λ°μ΄νΈ μ μ(uint64_t
)λ₯Όread(2)
μ μ€ λ²νΌλ‘ λ°ννλ€. (λ°νλλ κ°μ νΈμ€νΈ λ°μ΄νΈ μμ, μ¦ νΈμ€νΈ λ¨Έμ μ체μ μ μ λ°μ΄νΈ μμλ‘ λμ΄ μλ€.)read(2)
μμ κΉμ§ νμ΄λ¨Έ λ§λ£κ° λ°μνμ§ μμμΌλ©΄ λ€μ νμ΄λ¨Έ λ§λ£κΉμ§ νΈμΆμ΄ λΈλ‘ νλ€. λλ (fcntl(2)F_SETFL
λμμΌλ‘O_NONBLOCK
νλκ·Έλ₯Ό μ€μ ν΄μ) νμΌ λμ€ν¬λ¦½ν°λ₯Ό λΉλΈλ‘νΉμΌλ‘ λ§λ€μλ€λ©΄EAGAIN
μ€λ₯λ‘ μ€ν¨νλ€.μ 곡ν λ²νΌμ ν¬κΈ°κ° 8λ°μ΄νΈλ³΄λ€ μμΌλ©΄
read(2)
κ°EINVAL
μ€λ₯λ‘ μ€ν¨νλ€.μ°κ³λ ν΄λμ΄
CLOCK_REALTIME
μ΄λCLOCK_REALTIME_ALARM
μ΄κ³ , νμ΄λ¨Έκ° μ λμ΄κ³ (TFD_TIMER_ABSTIME
),timerfd_settime()
νΈμΆ λTFD_TIMER_CANCEL_ON_SET
νλκ·Έλ₯Ό μ§μ νλ€λ©΄ μ€μ μκ° ν΄λμ΄ λΆμ°μμ λ³κ²½μ κ±°μΉλ κ²½μ°read(2)
κ°ECANCELED
μ€λ₯λ‘ μ€ν¨νλ€. (μ΄λ₯Ό ν΅ν΄ μ½κΈ°λ₯Ό νλ μμ©μμ ν΄λμ λΆμ°μμ λ³κ²½μ΄ μΌμ΄λ¬μμ μμμ± μ μλ€.) - poll(2), select(2) (κΈ°ν μ μ¬ ν¨μ)
-
νμ΄λ¨Έ λ§λ£κ° ν λ² μ΄μ μΌμ΄λ¬μ λ νμΌ λμ€ν¬λ¦½ν°κ° μ½κΈ° κ°λ₯νλ€. (select(2)
readfds
μΈμ, poll(2)POLLIN
νλκ·Έ.)νμΌ λμ€ν¬λ¦½ν°κ° pselect(2), ppoll(2), epoll(7) κ°μ λ€λ₯Έ νμΌ λμ€ν¬λ¦½ν° λ€μ€ν APIλ μ§μνλ€.
ioctl(2)
-
λ€μμ timerfd νμ λͺ λ Ήμ μ§μνλ€.
-
TFD_IOC_SET_TICKS
(리λ μ€ 3.17λΆν°) - λ°μν νμ΄λ¨Έ λ§λ£ νμλ₯Ό μ‘°μ νλ€. μΈμλ μ λ§λ£ νμλ₯Ό λ΄μ 0 μλ 8λ°μ΄νΈ μ μμ λν ν¬μΈν°(
uint64_t*
)μ΄λ€. νμλ₯Ό μ€μ νκ³ λμ κ·Έ νμ΄λ¨Έμ λκΈ° μ€μΈ νλ‘μΈμ€κ° μμΌλ©΄ λͺ¨λ κΉ¨μ΄λ€. μ΄ λͺ λ Ήμ μ μΌν μ©λλ 체ν¬ν¬μΈνΈ/볡μ λͺ©μ μΌλ‘ λ§λ£ νμλ₯Ό 볡μνλ κ²μ΄λ€. 컀λμCONFIG_CHECKPOINT_RESTORE
μ΅μ μΌλ‘ ꡬμ±ν κ²½μ°μλ§ μ΄ λμμ΄ μ¬μ© κ°λ₯νλ€.
-
- close(2)
- νμΌ λμ€ν¬λ¦½ν°κ° λ μ΄μ νμνμ§ μμΌλ©΄ λ«μμΌ νλ€. λμΌ νμ΄λ¨Έ κ°μ²΄μ μ°κ³λ λͺ¨λ νμΌ λμ€ν¬λ¦½ν°κ° λ«νμ λ 컀λμ΄ νμ΄λ¨Έλ₯Ό ν΄μ νκ³ κ·Έ μμμ ν΄μ νλ€.
fork(2) λμ λ°©μ
timerfd_create()
μΌλ‘ μμ±ν νμΌ λμ€ν¬λ¦½ν°μ μ¬λ³Έμ fork(2) νμ μμμ΄ λ¬Όλ €λ°λλ€. κ·Έ νμΌ λμ€ν¬λ¦½ν°λ λΆλͺ¨μμμ λμνλ νμΌ λμ€ν¬λ¦½ν°μ κ°μ κΈ°λ° νμ΄λ¨Έ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ©°, μμμμ read(2)
νλ©΄ κ·Έ νμ΄λ¨Έμ λ§λ£μ λν μ 보λ₯Ό λ°ννκ² λλ€.
execve(2) λμ λ°©μ
timerfd_create()
μΌλ‘ μμ±ν νμΌ λμ€ν¬λ¦½ν°κ° execve(2)λ₯Ό κ±°μΉλ©΄μ 보쑴λλ©°, νμ΄λ¨Έκ° μ₯μ λμ΄ μμλ€λ©΄ κ³μ νμ΄λ¨Έ λ§λ£κ° λ°μνλ€.
μ±κ³΅ μ timerfd_create()
μ μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ©° μ€λ₯λ₯Ό λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
timerfd_settime()
κ³Ό timerfd_gettime()
μ μ±κ³΅ μ 0μ λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ©° μ€λ₯λ₯Ό λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
timerfd_create()
μ΄ λ€μ μ€λ₯λ‘ μ€ν¨ν μ μλ€.
EINVAL
-
clockid
μΈμκ°CLOCK_MONOTONIC
μ΄λCLOCK_REALTIME
μ΄ μλλ€. EINVAL
-
flags
κ° μ ν¨νμ§ μλ€. λλ 리λ μ€ 2.6.26 λλ μ΄μ μμflags
κ° 0μ΄ μλλ€. EMFILE
- μ΄λ¦° νμΌ λμ€ν¬λ¦½ν° κ°μμ λν νλ‘μΈμ€λ³ μ νμ λλ¬νλ€.
ENFILE
- μ΄λ¦° νμΌ μ΄κ°μμ λν μμ€ν μ μ μ νμ λλ¬νλ€.
ENODEV
- (λ΄λΆμ μΌλ‘ μ°λ) μ΅λͺ μμ΄λ Έλ μ₯μΉλ₯Ό λ§μ΄νΈ ν μ μμλ€.
ENOMEM
- νμ΄λ¨Έλ₯Ό μμ±νκΈ°μ 컀λ λ©λͺ¨λ¦¬κ° μΆ©λΆνμ§ μμλ€.
timerfd_settime()
κ³Ό timerfd_gettime()
μ΄ λ€μ μ€λ₯λ‘ μ€ν¨ν μ μλ€.
EBADF
-
fd
κ° μ ν¨ν νμΌ λμ€ν¬λ¦½ν°κ° μλλ€. EFAULT
-
new_value
λold_value
,curr_value
κ° μ ν¨ν ν¬μΈν°κ° μλλ€. EINVAL
-
fd
κ° μ ν¨ν timerfd νμΌ λμ€ν¬λ¦½ν°κ° μλλ€.
timerfd_settime()
μ΄ λ€μ μ€λ₯λ‘ μ€ν¨ν μλ μλ€.
EINVAL
-
new_value
κ° μ¬λ°λ‘ μ΄κΈ°ν λμ΄ μμ§ μλ€. (νtv_nsec
νλκ° 0μμ 999,999,999κΉμ§ λ²μ λ°μ μλ€.) EINVAL
-
flags
κ° μ ν¨νμ§ μλ€.
리λ μ€ μ»€λ 2.6.25λΆν° μ΄ μμ€ν νΈμΆλ€μ΄ μ¬μ© κ°λ₯νλ€. glibc λ²μ 2.8λΆν° λΌμ΄λΈλ¬λ¦¬ μ§μμ μ 곡νλ€.
μ΄ μμ€ν νΈμΆλ€μ 리λ μ€ μ μ©μ΄λ€.
νμ¬ timerfd_create()
κ° μ§μνλ ν΄λ ID μ’
λ₯κ° timer_create(2)λ³΄λ€ μ λ€.
λ€μ νλ‘κ·Έλ¨μ νμ΄λ¨Έλ₯Ό μμ±νκ³ μ κ·Έ μ§νμ μ§μΌλ³Έλ€. νλ‘κ·Έλ¨μ μΈ κ°κΉμ§μ λͺ λ Ήν μΈμλ₯Ό λ°λλ€. 첫 λ²μ§Έ μΈμλ νμ΄λ¨Έμ μ΅μ΄ λ§λ£κΉμ§μ μ΄ μλ₯Ό λνλΈλ€. λ λ²μ§Έ μΈμλ νμ΄λ¨Έμ μ΄ λ¨μ κ°κ²©μ λνλΈλ€. μΈ λ²μ§Έ μΈμλ μ’ λ£ μ κΉμ§ νλ‘κ·Έλ¨μμ νμ©ν΄μΌ νλ νμ΄λ¨Έ λ§λ£ νμλ₯Ό λνλΈλ€. λ λ²μ§Έμ μΈ λ²μ§Έ λͺ λ Ήν μΈμλ μ νμ μ΄λ€.
$ a.out 3 1 100
0.000: timer started
3.000: read: 1; total=1
4.000: read: 1; total=2
^Z # control+Z μ
λ ₯ν΄μ νλ‘κ·Έλ¨ μ μ§
[1]+ Stopped ./timerfd3_demo 3 1 100
$ fg # λͺ μ΄ νμ μ€ν μ¬κ°
a.out 3 1 100
9.660: read: 5; total=7
10.000: read: 1; total=8
11.000: read: 1; total=9
^C # control+C μ
λ ₯ν΄μ νλ‘κ·Έλ¨ μ€λ¨
#include <sys/timerfd.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h> /* uint64_t μ μ */
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void
print_elapsed_time(void)
{
static struct timespec start;
struct timespec curr;
static int first_call = 1;
int secs, nsecs;
if (first_call) {
first_call = 0;
if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
handle_error("clock_gettime");
}
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1)
handle_error("clock_gettime");
secs = curr.tv_sec - start.tv_sec;
nsecs = curr.tv_nsec - start.tv_nsec;
if (nsecs < 0) {
secs--;
nsecs += 1000000000;
}
printf("%d.%03d: ", secs, (nsecs + 500000) / 1000000);
}
int
main(int argc, char *argv[])
{
struct itimerspec new_value;
int max_exp, fd;
struct timespec now;
uint64_t exp, tot_exp;
ssize_t s;
if ((argc != 2) && (argc != 4)) {
fprintf(stderr, "%s init-secs [interval-secs max-exp]\n",
argv[0]);
exit(EXIT_FAILURE);
}
if (clock_gettime(CLOCK_REALTIME, &now) == -1)
handle_error("clock_gettime");
/* λͺ
λ Ήνμμ μ§μ ν μ΅μ΄ λ§λ£ μκ°μ κ°κ²©μΌλ‘
CLOCK_REALTIME μ λ μκ° νμ΄λ¨Έ μμ± */
new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);
new_value.it_value.tv_nsec = now.tv_nsec;
if (argc == 2) {
new_value.it_interval.tv_sec = 0;
max_exp = 1;
} else {
new_value.it_interval.tv_sec = atoi(argv[2]);
max_exp = atoi(argv[3]);
}
new_value.it_interval.tv_nsec = 0;
fd = timerfd_create(CLOCK_REALTIME, 0);
if (fd == -1)
handle_error("timerfd_create");
if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1)
handle_error("timerfd_settime");
print_elapsed_time();
printf("timer started\n");
for (tot_exp = 0; tot_exp < max_exp;) {
s = read(fd, &exp, sizeof(uint64_t));
if (s != sizeof(uint64_t))
handle_error("read");
tot_exp += exp;
print_elapsed_time();
printf("read: %llu; total=%llu\n",
(unsigned long long) exp,
(unsigned long long) tot_exp);
}
exit(EXIT_SUCCESS);
}
eventfd(2), poll(2), read(2)
, select(2), setitimer(2), signalfd(2), timer_create(2), timer_gettime(2), timer_settime(2), epoll(7), time(7)
2019-03-06