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

NAME

epoll_ctl - epoll 파일 λ””μŠ€ν¬λ¦½ν„° μ œμ–΄ μΈν„°νŽ˜μ΄μŠ€

SYNOPSIS

#include <sys/epoll.h>

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

DESCRIPTION

이 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•΄ 파일 λ””μŠ€ν¬λ¦½ν„° 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이닀.

RETURN VALUE

성곡 μ‹œ epoll_ctl()은 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ λ°œμƒ μ‹œ epoll_ctl()은 -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

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κ°€ μ •κ·œ νŒŒμΌμ΄λ‚˜ 디렉터리λ₯Ό 가리킀면 이 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

VERSIONS

컀널 버전 2.6μ—μ„œ epoll_ctl()이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

epoll_ctl()은 λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€. glibc 버전 2.3.2λΆ€ν„° 라이브러리 지원을 μ œκ³΅ν•œλ‹€.

NOTES

epoll μΈν„°νŽ˜μ΄μŠ€λŠ” poll(2)을 μ§€μ›ν•˜λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ λͺ¨λ‘ μ§€μ›ν•œλ‹€.

BUGS

컀널 버전 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 μ—­λŠ₯을 κ°€μ§€κ³  μžˆλŠ”μ§€ ν™•μ‹€νžˆ ν™•μΈν•˜λŠ” 게 μ’‹λ‹€.

SEE ALSO

epoll_create(2), epoll_wait(2), poll(2), epoll(7)


2019-03-16

⚠️ **GitHub.com Fallback** ⚠️