기본 콘텐츠로 건너뛰기

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.

댓글

이 블로그의 인기 게시물

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

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

Winget 해시 무시하기

가끔씩 Winget 에서 패키지를 다운로드 했을 때, "설치 관리자 해시가 일치하지 않습니다." 오류가 뜰 때가 있다. 보안 이슈가 있지만, 그냥 무시하고 싶을 때, 아래 순서로 무시해준다. 관리자 권한 winget settings --enable InstallerHashOverride 설치 winget install --ignore-security-hash --id NirSoft.NirCmd