epoll_wait(2) - wariua/manpages-ko GitHub Wiki
epoll_wait, epoll_pwait - epoll νμΌ λμ€ν¬λ¦½ν°μμ I/O μ΄λ²€νΈ κΈ°λ€λ¦¬κΈ°
#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,
int maxevents, int timeout,
const sigset_t *sigmask);
epoll_wait()
μμ€ν
νΈμΆμ νμΌ λμ€ν¬λ¦½ν° epfd
κ° κ°λ¦¬ν€λ epoll(7) μΈμ€ν΄μ€μμ μ΄λ²€νΈλ₯Ό κΈ°λ€λ¦°λ€. events
κ° κ°λ¦¬ν€λ λ©λͺ¨λ¦¬ μμμ μ΄λ²€νΈλ€μ΄ λ΄κΈ°κ² λμ΄ νΈμΆμκ° μ΄μ©ν μ μλ€. μ΅λ maxevents
κ° μ΄λ²€νΈλ₯Ό λ°ννλ€. maxevents
μΈμλ 0λ³΄λ€ μ»€μΌ νλ€.
timeout
μΈμλ epoll_wait()
μμ λΈλ‘ ν λ°λ¦¬μ΄ μλ₯Ό λνλΈλ€. CLOCK_MONOTONIC
ν΄λμΌλ‘ μκ°μ μΈ‘μ νλ€. λ€μ μ΄λ κ²½μ°λ ν΄λΉν λκΉμ§ νΈμΆμ΄ λΈλ‘ νκ² λλ€.
-
νμΌ λμ€ν¬λ¦½ν°κ° μ΄λ²€νΈλ₯Ό λ΄λλλ€.
-
νΈμΆμ΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λλ€.
-
νμμμμ΄ λ§λ£λλ€.
μ°Έκ³ λ‘ timeout
μκ°μ μμ€ν
ν΄λ ν΄μλμ λ°λΌ μ¬λ¦Ό νκ² λλ©° 컀λ μ€μΌμ€λ§ μ§μ°λ μκΈ° λλ¬Έμ κ·Έ λΈλ‘ μκ°μ μ½κ° λκΈΈ μλ μλ€. timeout
μ -1λ‘ μ§μ νλ©΄ epoll_wait()
μ΄ λ¬΄νμ λΈλ‘ νκ² λλ©°, timeout
μ 0μΌλ‘ μ§μ νλ©΄ κ°μ© μ΄λ²€νΈκ° μλλΌλ epoll_wait()
μ΄ μ¦μ λ°ννκ² λλ€.
struct epoll_event
λ λ€μμΌλ‘ μ μλΌ μλ€.
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* epoll μ΄λ²€νΈ */
epoll_data_t data; /* μ¬μ©μ λ°μ΄ν° λ³μ */
};
λ°νλ ꡬ쑰체 κ°κ°μ data
νλμλ ν΄λΉ μ΄λ¦° νμΌ κΈ°μ νλͺ©μ λν΄ κ°μ₯ μ΅κ·Ό epoll_ctl(2)(EPOLL_CTL_ADD
, EPOLL_CTL_MOD
)μμ μ§μ ν κ²κ³Ό λμΌν λ°μ΄ν°κ° λ΄κ²¨ μλ€. events
νλλ λ°νλ μ΄λ²€νΈ λΉνΈ νλλ₯Ό λ΄λλ€.
epoll_wait()
κ³Ό epoll_pwait()
μ κ΄κ³λ select(2)μ pselect(2)μ κ΄κ³μ λΉμ·νλ€. pselect(2)μ²λΌ μμ©μμ epoll_pwait()
μ μ¬μ©ν΄ νμΌ λμ€ν¬λ¦½ν°κ° μ€λΉ μνκ° λκ±°λ μκ·Έλμ μ‘μ λκΉμ§ μμ νκ² λκΈ°ν μ μλ€.
λ€μ epoll_pwait()
νΈμΆμ
ready = epoll_pwait(epfd, &events, maxevents, timeout, &sigmask);
λ€μ νΈμΆλ€μ μμμ μΌλ‘ μ€ννλ κ²κ³Ό λλ±νλ€.
sigset_t origmask;
pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ready = epoll_wait(epfd, &events, maxevents, timeout);
pthread_sigmask(SIG_SETMASK, &origmask, NULL);
sigmask
μΈμλ₯Ό NULLλ‘ μ§μ ν μ μμΌλ©°, κ·Έ κ²½μ° epoll_pwait()
μ epoll_wait()
κ³Ό λλ±νλ€.
μ±κ³΅ μ epoll_wait()
μ μμ² I/Oμ μ€λΉλ νμΌ λμ€ν¬λ¦½ν° μλ₯Ό λ°ννλ©°, μ§μ ν timeout
λ°λ¦¬μ΄ λμ μ€λΉ μνκ° λ νμΌ λμ€ν¬λ¦½ν°κ° μμΌλ©΄ 0μ λ°ννλ€. μ€λ₯ λ°μ μ epoll_wait()
μ -1μ λ°ννλ©° errno
λ₯Ό μ μ ν μ€μ νλ€.
EBADF
-
epfd
κ° μ μν νμΌ λμ€ν¬λ¦½ν°κ° μλλ€. EFAULT
-
events
κ° κ°λ¦¬ν€λ λ©λͺ¨λ¦¬ μμμ΄ μ°κΈ° κΆνμΌλ‘ μ κ·Ό κ°λ₯νμ§ μλ€. EINTR
- (1) μμ²ν ν μ΄λ²€νΈκ° λ°μνκ±°λ (2)
timeout
μ΄ λ§λ£νκΈ° μ μ νΈμΆμ΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λμλ€. signal(7) μ°Έκ³ . EINVAL
-
epfd
κ° epoll νμΌ λμ€ν¬λ¦½ν°κ° μλκ±°λ,maxevents
κ° 0λ³΄λ€ μκ±°λ κ°λ€.
컀λ λ²μ 2.6μμ epoll_wait()
μ΄ μΆκ°λμλ€. glibc λ²μ 2.3.2λΆν° λΌμ΄λΈλ¬λ¦¬ μ§μμ μ 곡νλ€.
리λ
μ€ μ»€λ 2.6.19μμ epoll_pwait()
μ΄ μΆκ°λμλ€. glibc λ²μ 2.6λΆν° λΌμ΄λΈλ¬λ¦¬ μ§μμ μ 곡νλ€.
epoll_wait()
μ 리λ
μ€ μ μ©μ΄λ€.
ν μ€λ λκ° epoll_pwait()
νΈμΆ λ΄μμ λΈλ‘ λΌ μλ λμ λ€λ₯Έ μ€λ λμμ κ·Έ epoll μΈμ€ν΄μ€μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μΆκ°νλ κ² κ°λ₯νλ€. μ νμΌ λμ€ν¬λ¦½ν°κ° μ€λΉ μνκ° λλ©΄ epoll_wait()
νΈμΆμ λΈλ‘μ΄ νλ¦¬κ² λλ€.
epoll_wait()
νΈμΆ μ maxevents
κ°λ₯Ό λλ νμΌ λμ€ν¬λ¦½ν°κ° μ€λΉ μνμ΄λ©΄ μ΄μ΄μ§λ epoll_wait()
νΈμΆμμ μ€λΉ μν νμΌ λμ€ν¬λ¦½ν°λ€μ λΌμ΄λ λ‘λΉμΌλ‘ μ²λ¦¬νκ² λλ€. μ΄ λμμ νλ‘μΈμ€μμ μ€λΉ μνλΌκ³ μκ³ μλ νμΌ λμ€ν¬λ¦½ν°λ€μ μ§μ€νλλΌ μ€λΉ μνμΈ νμΌ λμ€ν¬λ¦½ν°κ° λ μλ€λ κ±Έ μμμ±μ§ λͺ»ν΄μ λ°μνλ κΈ°μ μν©μ νΌνλ λ° λμμ΄ λλ€.
μ°Έκ³ λ‘ κ΄μ¬ λͺ©λ‘μ΄ νμ¬ λΉμ΄ μλ (λλ λ€λ₯Έ μ€λ λμμ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ«κ±°λ κ΄μ¬ λͺ©λ‘μμ μ κ±°ν΄μ κ΄μ¬ λͺ©λ‘μ΄ λΉκ² λλ) epoll μΈμ€ν΄μ€μλ epoll_wait()
νΈμΆμ΄ κ°λ₯νλ€. μ΄ν (λ€λ₯Έ μ€λ λμμ) κ΄μ¬ λͺ©λ‘μ μ΄λ€ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μΆκ°νκ³ κ·Έ νμΌ λμ€ν¬λ¦½ν°κ° μ€λΉ μνκ° λ λκΉμ§ νΈμΆμ΄ λΈλ‘ νκ² λλ€.
컀λ 2.6.37 μ μμλ timeout
κ°μ΄ μ½ LONG_MAX / HZ
λ°λ¦¬μ΄λ³΄λ€ ν¬λ©΄ -1μΌλ‘ (μ¦ λ¬΄νμΌλ‘) μ²λ¦¬νλ€. κ·Έλμ κ°λ Ή sizeof(long)
μ΄ 4μ΄κ³ 컀λ HZ
κ°μ΄ 1000μΈ μμ€ν
μ΄λΌλ©΄ 35.79 λΆλ³΄λ€ ν° νμμμμ 무νμΌλ‘ μ²λ¦¬νλ€.
μ§μ§ epoll_pwait()
μμ€ν
νΈμΆμλ μ¬μ― λ²μ§Έ μΈμ size_t sigsetsize
κ° μλλ°, μ΄λ sigmask
μΈμμ λ°μ΄νΈ λ¨μ ν¬κΈ°λ₯Ό λνλΈλ€. glibcμ epoll_pwait()
λνΌ ν¨μμμ μ΄ μΈμλ₯Ό κ³ μ λ κ°(sizeof(sigset_t)
)μΌλ‘ μ§μ νλ€.
epoll_create(2), epoll_ctl(2), epoll(7)
2019-03-06