Linux에서 사용할 수 있는 최고 MUX, epoll! 아흥~* 이것에 그냥 아주 녹아들어 살고 있다. 아주 좋아좋아~*
각설하고, 프로그래머라면 될 수 있으면 잘 설계한 소스 하나 가지고 여기저기 사골 울궈 먹듯 울궈 먹고 싶어할 것이다. 나 역시 그랬고, 기존 poll을 잘 씌운 클래스를 epoll로 포팅하려고 했다. 이때 문제점이 하나 있는데, 각 API에서 이벤트를 나타내는 변수를 POLL* 또는 EPOLL*로 처리하고 있다. 많이 쓰이는 녀석(IN, OUT, ERROR)은 대충 비슷해보이는데 말이야... 변환 없이 그냥 EPOLL에 POLL* 쓰면 혼날까? 결과적으론 EPOLL*랑 POLL*랑 동일한 녀석이다. 소스를 보자...
소스가 이렇고, 대충 실행 결과는 아래와 같다.
변수형만 POLL*은 int(#define이므로)이고, EPOLL은 enum EPOLL_EVENTS일 뿐이다. 그러나 그것도 뭐, 결국 똑같이 integer란 이야기지만... 아눼... 근데 epoll의 이벤트를 POLL*로 써도 된다는 이야기가 어디에도 없다. 만약 POLL*이벤트를 그냥 사용하도록 열심히 개발했는데, 어느날 갑자기 Linux Kernel이 2.8로 올라가면서 EPOLL*이벤트가 확 바껴버렸다!...라고 한다면 절망이다.
각설하고, 프로그래머라면 될 수 있으면 잘 설계한 소스 하나 가지고 여기저기 사골 울궈 먹듯 울궈 먹고 싶어할 것이다. 나 역시 그랬고, 기존 poll을 잘 씌운 클래스를 epoll로 포팅하려고 했다. 이때 문제점이 하나 있는데, 각 API에서 이벤트를 나타내는 변수를 POLL* 또는 EPOLL*로 처리하고 있다. 많이 쓰이는 녀석(IN, OUT, ERROR)은 대충 비슷해보이는데 말이야... 변환 없이 그냥 EPOLL에 POLL* 쓰면 혼날까? 결과적으론 EPOLL*랑 POLL*랑 동일한 녀석이다. 소스를 보자...
#include <cstdio> #include <cstdlib> #include <typeinfo> using namespace std; #include <sys/poll.h> #include <sys/epoll.h> #define SHOWDEF(x) \ printf("%s(%s,%u): 0x%04X\n", #x, typeid(x).name(), sizeof(x), x) #define CMPDEF(x) \ printf("compare %s: %d\n", #x, POLL##x == EPOLL##x) int main(int,char**) { SHOWDEF(POLLIN); SHOWDEF(POLLPRI); SHOWDEF(POLLOUT); SHOWDEF(POLLERR); SHOWDEF(POLLHUP); SHOWDEF(EPOLLIN); SHOWDEF(EPOLLPRI); SHOWDEF(EPOLLOUT); SHOWDEF(EPOLLERR); SHOWDEF(EPOLLHUP); CMPDEF(IN); CMPDEF(PRI); CMPDEF(OUT); CMPDEF(ERR); CMPDEF(HUP); return 0; }
소스가 이렇고, 대충 실행 결과는 아래와 같다.
POLLIN(i,4): 0x0001
POLLPRI(i,4): 0x0002
POLLOUT(i,4): 0x0004
POLLERR(i,4): 0x0008
POLLHUP(i,4): 0x0010
EPOLLIN(12EPOLL_EVENTS,4): 0x0001
EPOLLPRI(12EPOLL_EVENTS,4): 0x0002
EPOLLOUT(12EPOLL_EVENTS,4): 0x0004
EPOLLERR(12EPOLL_EVENTS,4): 0x0008
EPOLLHUP(12EPOLL_EVENTS,4): 0x0010
compare IN: 1
compare PRI: 1
compare OUT: 1
compare ERR: 1
compare HUP: 1
변수형만 POLL*은 int(#define이므로)이고, EPOLL은 enum EPOLL_EVENTS일 뿐이다. 그러나 그것도 뭐, 결국 똑같이 integer란 이야기지만... 아눼... 근데 epoll의 이벤트를 POLL*로 써도 된다는 이야기가 어디에도 없다. 만약 POLL*이벤트를 그냥 사용하도록 열심히 개발했는데, 어느날 갑자기 Linux Kernel이 2.8로 올라가면서 EPOLL*이벤트가 확 바껴버렸다!...라고 한다면 절망이다.
Powered by ScribeFire.
댓글
댓글 쓰기