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

NAME

timer_create - POSIX ํ”„๋กœ์„ธ์Šค๋ณ„ ํƒ€์ด๋จธ ๋งŒ๋“ค๊ธฐ

SYNOPSIS

#include <signal.h>
#include <time.h>

int timer_create(clockid_t clockid, struct sigevent *sevp,
                 timer_t *timerid);

-lrt๋กœ ๋งํฌ.

glibc ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ ์š”๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):

timer_create():
_POSIX_C_SOURCE >= 199309L

DESCRIPTION

timer_create()๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ณ„ ๊ฐ„๊ฒฉ ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ƒˆ ํƒ€์ด๋จธ์˜ ID๊ฐ€ timerid๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฒ„ํผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. timerid๋Š” ๋„ ์•„๋‹Œ ํฌ์ธํ„ฐ์—ฌ์•ผ ํ•œ๋‹ค. ์ด ID๋Š” ๊ทธ ํƒ€์ด๋จธ๊ฐ€ ์‚ญ์ œ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์œ ์ผํ•˜๋‹ค. ์ƒˆ๋กœ์šด ํƒ€์ด๋จธ๋Š” ์ฒ˜์Œ์— ํ•ด์ œ ์ƒํƒœ์ด๋‹ค.

clockid ์ธ์ž๋Š” ์ƒˆ ํƒ€์ด๋จธ๊ฐ€ ์‹œ๊ฐ„ ์ธก์ •์— ์‚ฌ์šฉํ•  ํด๋Ÿญ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ค์Œ ๊ฐ’๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

CLOCK_REALTIME
์„ค์ • ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹œ์Šคํ…œ ์ „์—ญ์ธ ์‹ค์ œ ์‹œ๊ฐ„ ํด๋Ÿญ.
CLOCK_MONOTONIC
์„ค์ • ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹œ์Šคํ…œ ๊ตฌ๋™ ํ›„ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ณผ๊ฑฐ ๋ถˆํŠน์ • ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋‹จ์กฐ ์ฆ๊ฐ€ ํด๋Ÿญ.
CLOCK_PROCESS_CPUTIME_ID (๋ฆฌ๋ˆ…์Šค 2.6.12๋ถ€ํ„ฐ)
ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค๊ฐ€ (๊ทธ ์•ˆ์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์ด) ์†Œ๋ชจํ•œ (์‚ฌ์šฉ์ž ๋ฐ ์‹œ์Šคํ…œ) CPU ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ํด๋Ÿญ.
CLOCK_THREAD_CPUTIME_ID (๋ฆฌ๋ˆ…์Šค 2.6.12๋ถ€ํ„ฐ)
ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ์†Œ๋ชจํ•œ (์‚ฌ์šฉ์ž ๋ฐ ์‹œ์Šคํ…œ) CPU ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ํด๋Ÿญ.
CLOCK_BOOTTIME (๋ฆฌ๋ˆ…์Šค 2.6.39๋ถ€ํ„ฐ)
CLOCK_MONOTONIC์ฒ˜๋Ÿผ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๋Š” ํด๋Ÿญ์ด๋‹ค. ํ•˜์ง€๋งŒ CLOCK_MONOTONIC ํด๋Ÿญ์—์„œ ์‹œ์Šคํ…œ์ด ์ ˆ์ „ ๋Œ€๊ธฐ ์ƒํƒœ์ธ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด CLOCK_BOOTTIME ํด๋Ÿญ์—์„œ๋Š” ์‹œ์Šคํ…œ์ด ์ ˆ์ „ ๋Œ€๊ธฐ ์ƒํƒœ์ธ ์‹œ๊ฐ„์„ ํฌํ•จํ•œ๋‹ค. ์ ˆ์ „ ๋Œ€๊ธฐ๋ฅผ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์‘์šฉ๋“ค์— ์œ ์šฉํ•˜๋‹ค. ๊ทธ๋Ÿฐ ์‘์šฉ๋“ค์— CLOCK_REALTIME์€ ์ ํ•ฉํ•˜์ง€ ์•Š์€๋ฐ, ๊ทธ ํด๋Ÿญ์€ ์‹œ์Šคํ…œ ํด๋Ÿญ์˜ ๋ถˆ์—ฐ์†์  ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
CLOCK_REALTIME_ALARM (๋ฆฌ๋ˆ…์Šค 3.0๋ถ€ํ„ฐ)
์ด ํด๋Ÿญ์€ CLOCK_REALTIME๊ณผ ๋น„์Šทํ•˜๋˜ ์‹œ์Šคํ…œ์ด ์ ˆ์ „ ๋Œ€๊ธฐ ์ƒํƒœ์ด๋ฉด ๊นจ์šฐ๊ฒŒ ๋œ๋‹ค. ์ด ํด๋Ÿญ์— ๋Œ€ํ•ด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„  ํ˜ธ์ถœ์ž๊ฐ€ CAP_WAKE_ALARM ์—ญ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
CLOCK_BOOTTIME_ALARM (๋ฆฌ๋ˆ…์Šค 3.0๋ถ€ํ„ฐ)
์ด ํด๋Ÿญ์€ CLOCK_BOOTTIME๊ณผ ๋น„์Šทํ•˜๋˜ ์‹œ์Šคํ…œ์ด ์ ˆ์ „ ๋Œ€๊ธฐ ์ƒํƒœ์ด๋ฉด ๊นจ์šฐ๊ฒŒ ๋œ๋‹ค. ์ด ํด๋Ÿญ์— ๋Œ€ํ•ด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„  ํ˜ธ์ถœ์ž๊ฐ€ CAP_WAKE_ALARM ์—ญ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์œ„ ๊ฐ’๋“ค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ clock_getcpuclockid(3) ๋‚ด์ง€ pthread_getcpuclockid(3) ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜ํ•œ clockid๋กœ๋„ clockid๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

sevp ์ธ์ž๋Š” ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ์ž๊ฐ€ ์•Œ๋ฆผ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๋Š” sigevent ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด ๊ตฌ์กฐ์ฒด์˜ ์ •์˜์™€ ์ผ๋ฐ˜์  ์„ธ๋ถ€ ๋‚ด์šฉ์€ sigevent(7)๋ฅผ ๋ณด๋ผ.

sevp.sigev_notify ํ•„๋“œ๊ฐ€ ๋‹ค์Œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

SIGEV_NONE
ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์•Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. timer_gettime(2)์„ ์ด์šฉํ•ด ํƒ€์ด๋จธ์˜ ์ง„ํ–‰์„ ํ™•์ธํ•œ๋‹ค.
SIGEV_SIGNAL
ํƒ€์ด๋จธ ๋งŒ๋ฃŒ ์‹œ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์‹œ๊ทธ๋„ sigev_signo๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ผ๋ฐ˜์  ์„ธ๋ถ€ ๋‚ด์šฉ์€ sigevent(7)๋ฅผ ๋ณด๋ผ. siginfo_t ๊ตฌ์กฐ์ฒด์˜ si_code ํ•„๋“œ๊ฐ€ SI_TIMER๋กœ ์„ค์ •๋œ๋‹ค. ์–ด๋А ์‹œ์ ์ด๋“  ์–ด๋–ค ํƒ€์ด๋จธ์— ๋Œ€ํ•ด ํ”„๋กœ์„ธ์Šค๋กœ์˜ ํ์— ์ตœ๋Œ€ ํ•œ ๊ฐœ ์‹œ๊ทธ๋„์ด ๋“ค์–ด๊ฐ„๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ timer_getoverrun(2)์„ ๋ณด๋ผ.
SIGEV_THREAD
ํƒ€์ด๋จธ ๋งŒ๋ฃŒ ์‹œ ์ƒˆ ์Šค๋ ˆ๋“œ์˜ ์‹œ์ž‘ ํ•จ์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ sigev_notify_function์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ sigevent(7)๋ฅผ ๋ณด๋ผ.
SIGEV_THREAD_ID (๋ฆฌ๋ˆ…์Šค ํ•œ์ •)
SIGEV_SIGNAL๊ณผ ๊ฐ™๋˜ sigev_notify_thread_id๋กœ ์ค€ ID๋ฅผ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ๊ทธ๋„์˜ ๋Œ€์ƒ์ด๋‹ค. ํ˜ธ์ถœ์ž์™€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์Šค๋ ˆ๋“œ์—ฌ์•ผ ํ•œ๋‹ค. sigev_notify_thread_id ํ•„๋“œ์—์„œ๋Š” ์ปค๋„ ์Šค๋ ˆ๋“œ ID๋ฅผ, ์ฆ‰ clone(2)์ด๋‚˜ gettid(2)๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์Šค๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์˜ ์‚ฌ์šฉ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

sevp๋ฅผ NULL๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ sigev_notify๊ฐ€ SIGEV_SIGNAL์ด๊ณ  sigev_signo๊ฐ€ SIGALRM, sigev_value.sival_int๊ฐ€ ํƒ€์ด๋จธ ID์ธ sigevent ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™๋“ฑํ•˜๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ timer_create()์€ 0์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ƒˆ ํƒ€์ด๋จธ์˜ ID๊ฐ€ *timerid์— ๋“ค์–ด๊ฐ„๋‹ค. ์‹คํŒจ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์„ค์ •ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ERRORS

EAGAIN
์ปค๋„ ๋‚ด ํƒ€์ด๋จธ ๊ตฌ์กฐ์ฒด ํ• ๋‹น ์ค‘์˜ ์ผ์‹œ์  ์˜ค๋ฅ˜.
EINVAL
ํด๋Ÿญ ID๋‚˜ sigev_notify, sigev_signo, sigev_notify_thread_id๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค.
ENOMEM
๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค 2.6๋ถ€ํ„ฐ ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

CONFORMING TO

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

NOTES

ํ”„๋กœ๊ทธ๋žจ์—์„œ timer_create()๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„๊ฒฉ ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

fork(2)์˜ ์ž์‹์ด ํƒ€์ด๋จธ๋ฅผ ๋ฌผ๋ ค๋ฐ›์ง€ ์•Š์œผ๋ฉฐ execve(2) ์ค‘์— ํƒ€์ด๋จธ๊ฐ€ ํ•ด์ œ ๋ฐ ์‚ญ์ œ๋œ๋‹ค.

timer_create()๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“  ๊ฐ ํƒ€์ด๋จธ๋งˆ๋‹ค ์ปค๋„์ด "ํ์— ๋“ค์–ด๊ฐ„ ์‹ค์‹œ๊ฐ„ ์‹œ๊ทธ๋„"์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•œ๋‹ค. ๋”ฐ๋ผ์„œ RLIMIT_SIGPENDING ์ž์› ์ œํ•œ์— ์˜ํ•ด ํƒ€์ด๋จธ ๊ฐœ์ˆ˜๊ฐ€ ์ œํ•œ๋œ๋‹ค (setrlimit(2) ์ฐธ๊ณ ).

timer_create()๋กœ ๋งŒ๋“  ํƒ€์ด๋จธ๋ฅผ ๋ณดํ†ต "POSIX (๊ฐ„๊ฒฉ) ํƒ€์ด๋จธ"๋ผ๊ณ  ํ•œ๋‹ค. POSIX ํƒ€์ด๋จธ API๋Š” ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค๋“ค๋กœ ์ด๋ค„์ ธ ์žˆ๋‹ค.

  • timer_create(): ํƒ€์ด๋จธ ๋งŒ๋“ค๊ธฐ.

  • timer_settime(2): ํƒ€์ด๋จธ๋ฅผ ์žฅ์ „(์‹œ์ž‘)ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œ(์ •์ง€)ํ•˜๊ธฐ.

  • timer_gettime(2): ํƒ€์ด๋จธ ๋‹ค์Œ ๋งŒ๋ฃŒ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„๊ณผ ํƒ€์ด๋จธ ๊ฐ„๊ฒฉ ์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ.

  • timer_getoverrun(2): ์ตœ๊ทผ ํƒ€์ด๋จธ ๋งŒ๋ฃŒ์— ๋Œ€ํ•ด ์ดˆ๊ณผ ํšŸ์ˆ˜ ๋ฐ˜ํ™˜ํ•˜๊ธฐ.

  • timer_delete(2): ํƒ€์ด๋จธ๋ฅผ ํ•ด์ œํ•˜๊ณ  ์‚ญ์ œํ•˜๊ธฐ.

๋ฆฌ๋ˆ…์Šค 3.10๋ถ€ํ„ฐ๋Š” /proc/[pid]/timers ํŒŒ์ผ์„ ์ด์šฉํ•ด PID๊ฐ€ pid์ธ ํ”„๋กœ์„ธ์Šค์˜ POSIX ํƒ€์ด๋จธ๋“ค์„ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋Š” proc(5)์„ ๋ณด๋ผ.

๋ฆฌ๋ˆ…์Šค 4.10๋ถ€ํ„ฐ๋Š” POSIX ํƒ€์ด๋จธ ์ง€์›์ด ๊ตฌ์„ฑ ๊ฐ€๋Šฅ ์˜ต์…˜์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ๋‹ค. CONFIG_POSIX_TIMERS ์˜ต์…˜์„ ํ†ตํ•ด ์ปค๋„ ์ง€์›์„ ๋Œ ์ˆ˜ ์žˆ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ์ฐจ์ด

POSIX ํƒ€์ด๋จธ API์˜ ๊ตฌํ˜„ ์ผ๋ถ€๋ฅผ glibc์—์„œ ์ œ๊ณตํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • SIGEV_THREAD์˜ ๊ธฐ๋Šฅ์„ฑ ์ƒ๋‹น ๋ถ€๋ถ„์ด ์ปค๋„์ด ์•„๋‹ˆ๋ผ glibc์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. (์•Œ๋ฆผ์„ ๋‹ค๋ฃจ๋Š” ๋ฐ ๊ด€๋ จ๋œ ์Šค๋ ˆ๋“œ๊ฐ€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ POSIX ์Šค๋ ˆ๋“œ ๊ตฌํ˜„์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ ๊ทธ๋Ÿด ์ˆ˜๋ฐ–์— ์—†๋‹ค.) ํ”„๋กœ์„ธ์Šค๋กœ ์•Œ๋ฆผ์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์€ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด์„œ์ด์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ NPTL ๊ตฌํ˜„์—์„œ๋Š” sigev_notify ๊ฐ’์„ SIGEV_THREAD_ID๋กœ ํ•˜๊ณ  ๊ตฌํ˜„์—์„œ ์˜ˆ์•ฝํ•ด ๋‘” ์‹ค์‹œ๊ฐ„ ์‹œ๊ทธ๋„์„ ์ด์šฉํ•œ๋‹ค (nptl(7) ์ฐธ๊ณ ).

  • evp๊ฐ€ NULL์ธ ๊ธฐ๋ณธ ๊ฒฝ์šฐ ๊ตฌํ˜„์„ glibc ๋‚ด์—์„œ ๋‹ค๋ฃฌ๋‹ค. ์ ์ ˆํžˆ ์ฑ„์šด sigevent ๊ตฌ์กฐ์ฒด๋กœ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ถ€๋ฅธ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์ฃผ๊ณ ๋ฐ›๋Š” ํƒ€์ด๋จธ ID๋“ค์„ glibc์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด ID๋“ค์„ ์ปค๋„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ด๋จธ ID๋“ค๋กœ ์‚ฌ์ƒํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค 2.6์—์„œ POSIX ํƒ€์ด๋จธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค. ๊ทธ ์ „์— glibc์—์„œ POSIX ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ถˆ์™„์ „ํ•œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๊ตฌํ˜„์„ (CLOCK_REALTIME ํƒ€์ด๋จธ๋งŒ) ์ œ๊ณตํ•˜์˜€์œผ๋ฉฐ glibc ๋ฒ„์ „ 2.17 ์ „์˜ ๊ตฌํ˜„์—์„œ๋Š” 2.6 ์ „ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์„ ๋Œ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์—์„œ ์ด ๊ธฐ๋ฒ•์— ์˜์ง€ํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋‘ ๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ดˆ ๋‹จ์œ„์˜ sleep ์ฃผ๊ธฐ์™€ ๋‚˜๋…ธ์ดˆ ๋‹จ์œ„์˜ ํƒ€์ด๋จธ ๋นˆ๋„์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ํƒ€์ด๋จธ์— ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ทธ๋„์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๊ณ , ๊ทธ ์‹œ๊ทธ๋„์„ ์ฐจ๋‹จํ•˜๊ณ , ์ฃผ์–ด์ง„ ๋นˆ๋„๋กœ ๋งŒ๋ฃŒ๋˜๋Š” ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์žฅ์ „ํ•˜๊ณ , ์ง€์ •ํ•œ ์ดˆ ๋™์•ˆ ์ž ๋“ค๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ํƒ€์ด๋จธ ์‹œ๊ทธ๋„ ์ฐจ๋‹จ์„ ํ‘ผ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์ž ๋“ค์—ˆ๋˜ ๋™์•ˆ ํƒ€์ด๋จธ๊ฐ€ ์ตœ์†Œ ํ•œ ๋ฒˆ์€ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋  ๊ฒƒ์ด๊ณ  ํ•ธ๋“ค๋Ÿฌ์—์„œ ํƒ€์ด๋จธ ์•Œ๋ฆผ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋œ ํ›„์—๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.

๋‹ค์Œ ์‹คํ–‰ ์˜ˆ์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ 100๋‚˜๋…ธ์ดˆ ๋นˆ๋„๋กœ ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ 1์ดˆ ๋™์•ˆ ์ž ๋“ ๋‹ค. ์‹œ๊ทธ๋„ ์ฐจ๋‹จ์ด ํ’€๋ ค์„œ ์ „๋‹ฌ๋˜๋Š” ์‹œ์ ๊นŒ์ง€ ์ฒœ๋งŒ ๋ฒˆ ์ •๋„์˜ ์ดˆ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค.

$ ./a.out 1 100
Establishing handler for signal 34
Blocking signal 34
timer ID is 0x804c008
Sleeping for 1 seconds
Unblocking signal 34
Caught signal 34
    sival_ptr = 0xbfb174f4;     *sival_ptr = 0x804c008
    overrun count = 10004886

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>

#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

static void
print_siginfo(siginfo_t *si)
{
    timer_t *tidp;
    int or;

    tidp = si->si_value.sival_ptr;

    printf("    sival_ptr = %p; ", si->si_value.sival_ptr);
    printf("    *sival_ptr = 0x%lx\n", (long) *tidp);

    or = timer_getoverrun(*tidp);
    if (or == -1)
        errExit("timer_getoverrun");
    else
        printf("    overrun count = %d\n", or);
}

static void
handler(int sig, siginfo_t *si, void *uc)
{
    /* ์ฃผ์˜: ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ printf()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€
       ์•Š๋‹ค. (๋”ฐ๋ผ์„œ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํ•˜์ง€ ๋ง์•„์•ผ
       ํ•œ๋‹ค.) printf()๊ฐ€ ๋น„๋™๊ธฐ ์‹œ๊ทธ๋„ ์•ˆ์ „์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
       signal-safety(7) ์ฐธ๊ณ . ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋œ
       ๊ฒƒ์„ ๊ฐ„๋‹จํžˆ ๋ณด์—ฌ ์ฃผ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— printf()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. */

    printf("Caught signal %d\n", sig);
    print_siginfo(si);
    signal(sig, SIG_IGN);
}

int
main(int argc, char *argv[])
{
    timer_t timerid;
    struct sigevent sev;
    struct itimerspec its;
    long long freq_nanosecs;
    sigset_t mask;
    struct sigaction sa;

    if (argc != 3) {
        fprintf(stderr, "Usage: %s <sleep-secs> <freq-nanosecs>\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

    /* ํƒ€์ด๋จธ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์„ค์ • */

    printf("Establishing handler for signal %d\n", SIG);
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = handler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(SIG, &sa, NULL) == -1)
        errExit("sigaction");

    /* ์ž ์‹œ ํƒ€์ด๋จธ ์‹œ๊ทธ๋„ ์ฐจ๋‹จ */

    printf("Blocking signal %d\n", SIG);
    sigemptyset(&mask);
    sigaddset(&mask, SIG);
    if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
        errExit("sigprocmask");

    /* ํƒ€์ด๋จธ ์ƒ์„ฑ */

    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIG;
    sev.sigev_value.sival_ptr = &timerid;
    if (timer_create(CLOCKID, &sev, &timerid) == -1)
        errExit("timer_create");

    printf("timer ID is 0x%lx\n", (long) timerid);

    /* ํƒ€์ด๋จธ ์‹œ์ž‘ */

    freq_nanosecs = atoll(argv[2]);
    its.it_value.tv_sec = freq_nanosecs / 1000000000;
    its.it_value.tv_nsec = freq_nanosecs % 1000000000;
    its.it_interval.tv_sec = its.it_value.tv_sec;
    its.it_interval.tv_nsec = its.it_value.tv_nsec;

    if (timer_settime(timerid, 0, &its, NULL) == -1)
         errExit("timer_settime");

    /* ์ž ๊น ๋ˆˆ ๋ถ™์ด๊ธฐ. ๊ทธ ๋™์•ˆ ํƒ€์ด๋จธ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ
       ๋งŒ๋ฃŒ๋  ์ˆ˜ ์žˆ์Œ */

    printf("Sleeping for %d seconds\n", atoi(argv[1]));
    sleep(atoi(argv[1]));

    /* ํƒ€์ด๋จธ ์‹œ๊ทธ๋„ ์ฐจ๋‹จ์„ ํ’€์–ด์„œ ํƒ€์ด๋จธ ์•Œ๋ฆผ์ด
       ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ */

    printf("Unblocking signal %d\n", SIG);
    if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
        errExit("sigprocmask");

    exit(EXIT_SUCCESS);
}

SEE ALSO

clock_gettime(2), setitimer(2), timer_delete(2), timer_getoverrun(2), timer_settime(2), timerfd_create(2), clock_getcpuclockid(3), pthread_getcpuclockid(3), pthreads(7), sigevent(7), signal(7), time(7)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ