본문 바로가기

프로그래밍/API

TIP. EPOLLONESHOT 사용 이슈

LINUX에서 네트워크 이벤트를 처리하기 위해 사용하는 방식으로 epoll을 많이 사용한다.


장점이 많은데 epoll의 장점 중 하나가 EPOLLONESHOT이라는 플레그가 있다.


 EPOLLONESHOT의 용도는 이벤트가 발생될때 한번만 발생되고, 대기상태로 진입하게 하는 특성을 가진다.


 그런데, 문제가 하나 있다.


    - 이벤트가 발생된 이후에, 이벤트를 재 설정(epoll_ctl(EPOLL_CTL_MOD)) 하면서 발생하게 된다.

    - 설정 이후에, 소켓의 이벤트가 발생되지 않는 문제가 바로 그것이다.


이는 최근 커널에서 EPOLLWAKEUP 으로 해결이 되었는데, 지원하지 않은 경우는 다음 방식을 사용하면 된다.


   ioctl(fd, FIONREAD, &nread);


단, 소켓에서만 해당 syscall을 사용할수 있다.