기본 콘텐츠로 건너뛰기

EPOLL* == POLL*

Linux에서 사용할 수 있는 최고 MUX, 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.

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)