epoll_ctl(2) - wariua/manpages-ko GitHub Wiki
epoll_ctl - epoll νμΌ λμ€ν¬λ¦½ν° μ μ΄ μΈν°νμ΄μ€
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
μ΄ μμ€ν
νΈμΆμ μ¬μ©ν΄ νμΌ λμ€ν¬λ¦½ν° epfd
κ° κ°λ¦¬ν€λ epoll(7) μΈμ€ν΄μ€μ κ΄μ¬ λͺ©λ‘μμ νλͺ©μ μΆκ°, λ³κ²½, μ κ±°νλ€. λμ νμΌ λμ€ν¬λ¦½ν° fd
μ λν΄ λμ op
λ₯Ό μννκΈ°λ₯Ό μμ²νλ€.
op
μΈμμ μ ν¨ν κ°μ λ€μκ³Ό κ°λ€.
EPOLL_CTL_ADD
- κ΄μ¬ λͺ©λ‘μ
fd
λ₯Ό μΆκ°νκ³fd
μ μ°κ²°λ λ΄λΆ νμΌμevent
μ μ€μ μ μ°κ³νλ€. EPOLL_CTL_MOD
- κ΄μ¬ λͺ©λ‘μμ
fd
μ μ°κ³λ μ€μ μevent
μ μ μ€μ μΌλ‘ λ°κΎΌλ€. EPOLL_CTL_DEL
- κ΄μ¬ λͺ©λ‘μμ λμ νμΌ λμ€ν¬λ¦½ν°
fd
λ₯Ό μ κ±°(λ±λ‘ ν΄μ )νλ€.event
λ 무μλλ©° NULLμΌ μ μλ€. (νμ§λ§ μλ BUGS μ°Έκ³ .)
event
μΈμλ νμΌ λμ€ν¬λ¦½ν° fd
μ μ°κ²°ν κ°μ²΄λ₯Ό κΈ°μ νλ€. 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; /* μ¬μ©μ λ°μ΄ν° λ³μ */
};
events
λ©€λ²λ μ¬μ© κ°λ₯ν λ€μ μ΄λ²€νΈ μ’
λ₯λ€μ 0κ° μ΄μ OR ν΄μ ꡬμ±ν λΉνΈ λ§μ€ν¬μ΄λ€.
EPOLLIN
- μ°κ³ νμΌμ΄
read(2)
μ μ¬μ© κ°λ₯νλ€. EPOLLOUT
- μ°κ³ νμΌμ΄
write(2)
μ μ¬μ© κ°λ₯νλ€. -
EPOLLRDHUP
(리λ μ€ 2.6.17λΆν°) - μ€νΈλ¦Ό μμΌμ μλκ° μ°κ²°μ λ«μκ±°λ μ°κ²°μ μ°κΈ° μͺ½μ λ«μλ€. (μ΄ νλκ·Έλ νΉν μμ§ νΈλ¦¬κ±° μ¬μ© μ κ°λ¨ν μ½λ μμ±μΌλ‘ μλμ shutdownμ νμ§νλ λ° μ μ©νλ€.)
EPOLLPRI
- νμΌ λμ€ν¬λ¦½ν°μ μ΄λ€ μμΈ μν©μ΄ μλ€. poll(2)μ
POLLPRI
μ€λͺ μ°Έκ³ . EPOLLERR
- μ°κ³ νμΌ λμ€ν¬λ¦½ν°μμ μ€λ₯ μν©μ΄ λ°μνλ€. λ νμ΄νμ μ½κΈ° μͺ½μ΄ λ«νμ λ μ°κΈ° μͺ½μμ μ΄ μ΄λ²€νΈκ° λ³΄κ³ λλ€. epoll_wait(2)μ νμ μ΄ μ΄λ²€νΈλ₯Ό λ³΄κ³ νλ―λ‘
events
μ μ€μ νμ§ μμλ λλ€. EPOLLHUP
-
μ°κ³ νμΌ λμ€ν¬λ¦½ν°μμ μ°κ²°μ΄ λκ²Όλ€. epoll_wait(2)μ νμ μ΄ μ΄λ²€νΈλ₯Ό λ³΄κ³ νλ―λ‘
events
μ μ€μ νμ§ μμλ λλ€.μ°Έκ³ λ‘ νμ΄νλ μ€νΈλ¦Ό μμΌ κ°μ μ±λμμ μ½κΈ°λ₯Ό ν λ μ΄ μ΄λ²€νΈλ μλκ° μ±λμ κ·Έμͺ½ λμ λ«μλ€λ νμμΌ λΏμ΄λ€. κ·Έ μ±λμ λ―Έμ²λ¦¬ λ°μ΄ν°λ₯Ό λͺ¨λ μλΉν νμμΌ μ±λ μ½κΈ°κ° 0(νμΌ λ)μ λ°ννκ² λλ€.
EPOLLET
- μ°κ³ νμΌ λμ€ν¬λ¦½ν°μ μμ§ νΈλ¦¬κ±° λμμ μ€μ νλ€. epollμ κΈ°λ³Έ λμ λ°©μμ λ 벨 νΈλ¦¬κ±°λ€. μμ§ νΈλ¦¬κ±° λ° λ 벨 νΈλ¦¬κ±° μ΄λ²€νΈ λ°°ν¬ κ΅¬μ‘°μ λν μμΈν μ 보λ epoll(7)μ 보λΌ.
-
EPOLLONESHOT
(리λ μ€ 2.6.2λΆν°) - μ°κ³ νμΌ λμ€ν¬λ¦½ν°μ λ¨λ° λμμ μ€μ νλ€. μ¦ epoll_wait(2)μΌλ‘ μ΄λ²€νΈλ₯Ό νλ κΊΌλ΄κ³ λλ©΄ μ°κ³ νμΌ λμ€ν¬λ¦½ν°κ° λ΄λΆμ μΌλ‘ λΉνμ±νλμ΄ epoll μΈν°νμ΄μ€κ° λ€λ₯Έ μ΄λ²€νΈλ₯Ό λ³΄κ³ νμ§ μκ² λλ€. κ·Έ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ¬νμ±ννλ €λ©΄ μ¬μ©μκ° μ μ΄λ²€νΈ λ§μ€ν¬λ‘
epoll_ctl()
EPOLL_CTL_MOD
λ₯Ό νΈμΆν΄μΌ νλ€. -
EPOLLWAKEUP
(리λ μ€ 3.5λΆν°) -
EPOLLONESHOT
κ³ΌEPOLLET
κ° μ€μ λΌ μμ§ μκ³ νλ‘μΈμ€μκ²CAP_BLOCK_SUSPEND
μλ₯μ΄ μμΌλ©΄ μ΄ μ΄λ²€νΈκ° λκΈ° μ€μ΄κ±°λ μ²λ¦¬ μ€μΈ λμ μμ€ν μ΄ "λκΈ°"λ "νμ΄λ²λ€μ΄μ "μΌλ‘ λ€μ΄κ°μ§ μκ² νλ€. epoll_wait(2) νΈμΆμ΄ μ΄λ²€νΈλ₯Ό λ°νν μμ λΆν° μμν΄μ κ°μ epoll(7) νμΌ λμ€ν¬λ¦½ν°μ λ€μ epoll_wait(2) νΈμΆνκΈ°, κ·Έ νμΌ λμ€ν¬λ¦½ν° λ«κΈ°,EPOLL_CTL_DEL
λ‘ μ΄λ²€νΈ νμΌ λμ€ν¬λ¦½ν° μ κ±°νκΈ°,EPOLL_CTL_MOD
λ‘ μ΄λ²€νΈ νμΌ λμ€ν¬λ¦½ν°μμEPOLLWAKEUP
μμ κΈ°κΉμ§λ₯Ό "μ²λ¦¬ μ€"μ΄λΌκ³ λ³Έλ€. BUGSλ μ°Έκ³ . -
EPOLLEXCLUSIVE
(리λ μ€ 4.5λΆν°) -
λμ νμΌ λμ€ν¬λ¦½ν°
fd
μ λΆλ epoll νμΌ λμ€ν¬λ¦½ν°μ λ°°νμ κΉ¨μ°κΈ° λͺ¨λλ₯Ό μ€μ νλ€. κΉ¨μ°λ μ΄λ²€νΈκ° λ°μνλλ° κ°μ λμ νμΌμ μ¬λ¬ κ°μ epoll νμΌ λμ€ν¬λ¦½ν°κ°EPOLLEXCLUSIVE
λ‘ λΆμ΄ μμΌλ©΄ κ·Έ epoll νμΌ λμ€ν¬λ¦½ν°λ€ μ€ ν κ° λλ κ·Έ μ΄μμ΄ epoll_wait(2)λ‘ μ΄λ²€νΈλ₯Ό μμ νκ² λλ€. μ΄λ° κ²½μ°μ (EPOLLEXCLUSIVE
κ° μ€μ λΌ μμ§ μμ λμ) κΈ°λ³Έ λμμ λͺ¨λ epoll νμΌ λμ€ν¬λ¦½ν°λ€μ΄ μ΄λ²€νΈλ₯Ό μμ νλ κ²μ΄λ€. λ°λΌμ νΉμ μν©μμ λ¨μ²΄λ‘ κΉ¨μ΄λκΈ°(thundering herd) λ¬Έμ λ₯Ό νΌνλ λ°EPOLLEXCLUSIVE
κ° μΈλͺ¨κ° μλ€.μ¬λ¬ epoll μΈμ€ν΄μ€μ κ°μ νμΌ λμ€ν¬λ¦½ν°κ° μλλ° μΌλΆμλ
EPOLLEXCLUSIVE
νλκ·Έλ₯Ό μΌκ³ λλ¨Έμ§μλ κ·Έλ¬μ§ μμλ€λ©΄EPOLLEXCLUSIVE
λ₯Ό μ§μ νμ§ μμ epoll μΈμ€ν΄μ€λ λͺ¨λμ μ΄λ²€νΈκ° μ 곡λκ³EPOLLEXCLUSIVE
λ₯Ό μ§μ ν epoll μΈμ€ν΄μ€λ κ·Έ μ€ μ΅μ νλμ μ΄λ²€νΈκ° μ 곡λλ€.EPOLLEXCLUSIVE
μ ν¨κ» μ§μ ν μ μλ κ°λ€μEPOLLIN
,EPOLLOUT
,EPOLLWAKEUP
,EPOLLET
μ΄λ€.EPOLLHUP
κ³ΌEPOLLERR
λ μ§μ ν μλ μμ§λ§ κ·Έλ΄ νμκ° μλ€. μΈμ λμ²λΌ κ·Έ μ΄λ²€νΈλ€μevents
μ μ§μ νλμ§ μ¬λΆμ μκ΄μμ΄ λ°μνλ©΄ νμ λ³΄κ³ λλ€.events
μ κ·Έ μΈμ κ°μ μ§μ νλ €κ³ νλ©΄EINVAL
μ€λ₯κ° λλ€.EPOLLEXCLUSIVE
λEPOLL_CTL_ADD
λμμλ§ μΈ μ μλ€.EPOLL_CTL_MOD
μ μ°λ €κ³ νλ©΄ μ€λ₯κ° λλ€.epoll_ctl()
λ‘EPOLLEXCLUSIVE
λ₯Ό μ€μ ν΄ λμΌλ©΄ μ΄ν κ°μepfd
,fd
μ§μEPOLL_CTL_MOD
λ₯Ό νλ©΄ μ€λ₯κ° λλ€.events
μEPOLLEXCLUSIVE
λ₯Ό μ§μ νκ³ λμ νμΌ λμ€ν¬λ¦½ν°fd
μ epoll μΈμ€ν΄μ€λ₯Ό μ§μ ν΄μepoll_ctl()
μ νΈμΆνλ κ² μμ μ€ν¨νκ² λλ€. μ΄ κ²½μ° λͺ¨λμμμ μ€λ₯λEINVAL
μ΄λ€.
μ±κ³΅ μ epoll_ctl()
μ 0μ λ°ννλ€. μ€λ₯ λ°μ μ epoll_ctl()
μ -1μ λ°ννλ©° errno
λ₯Ό μ μ ν μ€μ νλ€.
EBADF
-
epfd
λfd
κ° μ ν¨ν νμΌ λμ€ν¬λ¦½ν°κ° μλλ€. EEXIST
-
op
κ°EPOLL_CTL_ADD
μΈλ° μ 곡λ νμΌ λμ€ν¬λ¦½ν°fd
κ° μ΄λ―Έ κ·Έ epoll μΈμ€ν΄μ€μ λ±λ‘λΌ μλ€. EINVAL
-
epfd
κ° epoll νμΌ λμ€ν¬λ¦½ν°κ° μλκ±°λ,fd
κ°epfd
μ κ°κ±°λ, μμ²ν λμop
λ₯Ό μ΄ μΈν°νμ΄μ€μμ μ§μνμ§ μλλ€. EINVAL
-
events
μEPOLLEXCLUSIVE
μ λλΆμ΄ μ ν¨νμ§ μμ μ΄λ²€νΈ μ’ λ₯λ₯Ό μ§μ νλ€. EINVAL
-
op
κ°EPOLL_CTL_MOD
μΈλ°events
μEPOLLEXCLUSIVE
κ° ν¬ν¨λΌ μλ€. EINVAL
-
op
κ°EPOLL_CTL_MOD
μΈλ° μμ κ·Έepfd
,fd
μ§μEPOLLEXCLUSIVE
νλκ·Έκ° μ μ©λμλ€. EINVAL
-
event
μEPOLLEXCLUSIVE
λ₯Ό μ§μ νλλ°fd
κ° epoll μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€. ELOOP
-
fd
κ° epoll μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€λλ° μ΄EPOLL_CTL_ADD
λμμΌλ‘ μΈν΄ epoll μΈμ€ν΄μ€λ€μ΄ μλ‘λ₯Ό κ°μνλ 루νκ° μκΈ°κ² λλ€. ENOENT
-
op
κ°EPOLL_CTL_MOD
λEPOLL_CTL_DEL
μΈλ°fd
κ° κ·Έ epoll μΈμ€ν΄μ€μ λ±λ‘λΌ μμ§ μλ€. ENOMEM
- μμ²ν
op
μ μ΄ λμμ μ²λ¦¬νκΈ°μ μΆ©λΆν λ©λͺ¨λ¦¬κ° μλ€. ENOSPC
- epoll μΈμ€ν΄μ€μ μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ±λ‘(
EPOLL_CTL_ADD
)νλ € νλ μ€μ/proc/sys/fs/epoll/max_user_watches
μ λ°λ₯Έ μ νμ κ±Έλ Έλ€. μμΈν λ΄μ©μ epoll(7) μ°Έκ³ . EPERM
- λμ νμΌ
fd
κ° epollμ μ§μνμ§ μλλ€. μλ₯Ό λ€μ΄fd
κ° μ κ· νμΌμ΄λ λλ ν°λ¦¬λ₯Ό κ°λ¦¬ν€λ©΄ μ΄ μ€λ₯κ° λ°μν μ μλ€.
컀λ λ²μ 2.6μμ epoll_ctl()
μ΄ μΆκ°λμλ€.
epoll_ctl()
μ 리λ
μ€ μ μ©μ΄λ€. glibc λ²μ 2.3.2λΆν° λΌμ΄λΈλ¬λ¦¬ μ§μμ μ 곡νλ€.
epoll μΈν°νμ΄μ€λ poll(2)μ μ§μνλ νμΌ λμ€ν¬λ¦½ν°λ€μ λͺ¨λ μ§μνλ€.
컀λ λ²μ 2.6.9 μ μμλ EPOLL_CTL_DEL
λμμμ event
λ₯Ό 무μνλλ°λ κ·Έ μΈμμ λ μλ ν¬μΈν°κ° μμ΄μΌ νλ€. 리λ
μ€ 2.6.9λΆν°λ EPOLL_CTL_DEL
μ΄μ© μ event
μ NULLμ μ§μ ν μ μλ€. 2.6.9 μ 컀λλ‘ μ΄μ κ°λ₯ν΄μΌ νλ μμ©μμλ event
μ λ μλ ν¬μΈν°λ₯Ό μ§μ ν΄ μ£Όλ κ² μ’λ€.
flags
μ EPOLLWAKEUP
μ μ§μ νμ§λ§ νΈμΆμμκ² CAP_BLOCK_SUSPEND
μλ₯μ΄ μλ κ²½μ°μλ EPOLLWAKEUP
νλκ·Έκ° μ‘°μ©ν 무μλλ€. μ΄λ° μ κ°μ€λ° λμ λ°©μμ΄ νμν μ΄μ λ μ΅μ΄ ꡬνμμ flags
μΈμμ μ ν¨μ± κ²μ¬λ₯Ό μννμ§ μμλ λ°λ€κ°, κ²μ¬λ₯Ό ν΄μ νΈμΆμκ° CAP_BLOCK_SUSPEND
μλ₯μ κ°μ§κ³ μμ§ μμΌλ©΄ νΈμΆμ΄ μ€ν¨νλλ‘ EPOLLWAKEUP
μ μΆκ°νλ©΄ νν μμμ μΌλ‘ (κ·Έλ¦¬κ³ λΆνμνκ²) κ·Έ λΉνΈλ₯Ό μ€μ νκΈ° λλ¬Έμ λμμ λ¬Έμ κ° μκΈΈ κΈ°μ‘΄ μ¬μ©μ κ³΅κ° μμ©μ΄ μ μ΄λ ν κ°μ§ μμκΈ° λλ¬Έμ΄λ€. λ°λΌμ κ²¬κ³ ν μμ©μ΄λΌλ©΄ EPOLLWAKEUP
νλκ·Έλ₯Ό μ°λ € ν λ CAP_BLOCK_SUSPEND
μλ₯μ κ°μ§κ³ μλμ§ νμ€ν νμΈνλ κ² μ’λ€.
epoll_create(2), epoll_wait(2), poll(2), epoll(7)
2019-03-16