timer_create(2) - wariua/manpages-ko GitHub Wiki
timer_create - POSIX ํ๋ก์ธ์ค๋ณ ํ์ด๋จธ ๋ง๋ค๊ธฐ
#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
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
๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ง์ ํ๋ ๊ฒ๊ณผ ๋๋ฑํ๋ค.
์ฑ๊ณต ์ timer_create()
์ 0์ ๋ฐํํ๋ฉฐ ์ ํ์ด๋จธ์ ID๊ฐ *timerid
์ ๋ค์ด๊ฐ๋ค. ์คํจ ์ -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ค์ ํ์ฌ ์ค๋ฅ๋ฅผ ๋ํ๋ธ๋ค.
EAGAIN
- ์ปค๋ ๋ด ํ์ด๋จธ ๊ตฌ์กฐ์ฒด ํ ๋น ์ค์ ์ผ์์ ์ค๋ฅ.
EINVAL
- ํด๋ญ ID๋
sigev_notify
,sigev_signo
,sigev_notify_thread_id
๊ฐ ์ ํจํ์ง ์๋ค. ENOMEM
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค.
๋ฆฌ๋ ์ค 2.6๋ถํฐ ์ด ์์คํ ํธ์ถ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
POSIX.1-2001, POSIX.1-2008.
ํ๋ก๊ทธ๋จ์์ 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
์ต์
์ ํตํด ์ปค๋ ์ง์์ ๋ ์ ์๋ค.
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 ์ ๋ฆฌ๋
์ค ์ปค๋์ ๋๋ฆฌ๋ ์์คํ
์์ ์ด ๊ธฐ๋ฒ์ ์์งํ๋ค.
์๋ ํ๋ก๊ทธ๋จ์ ๋ ๊ฐ์ง ์ธ์๋ฅผ ๋ฐ๋๋ค. ์ด ๋จ์์ 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);
}
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