epoll 에서 이벤트 종류 알아내는 방법이...

sjang의 이미지

리눅스 커널 2.6에서 epoll를 사용하고 있습니다.

아래 함수

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)

를 이용하여 이벤트 발생을 감지할 때, 이벤트가 발생한

소켓 FD에서 이벤트의 종류가 READ 또는 WRITE 이벤트인지

어떻게 구분하나요? 아래는 이것을 위한 코드인데요.

해당 FD에서 epool.h에 정의된 events의 값으로부터

'&' 연산을 이용하여 구하고 있습니다.

이렇게 하는 것이 맞습니까?

typedef struct epoll_event_data
{
    struct epoll_event *events;
    int nMaxFD;
    int epoll_fd;
} epoll_event_data_t;

int get_event_type(epoll_event_data_t *ed, int nEventFD)
{
    __uint32_t events;

    events = ed->events[nEventFD].events;
    if (events & EPOLLHUP)
        return EVENT_HANGUP;
    else if (events & EPOLLIN)
        return EVENT_READ;
    else if (events & EPOLLERR)
        return EVENT_ERROR;
    else if (events & EPOLLOUT)
        return EVENT_WRITE;

    return -1;
}

음....

events = ed->events[nEventFD].events;

위 변수에 저장되는 것이 해당FD에서 발생한 이벤트가 저장되는 것이 아니라, epoll_ctl()를 통해서 FD를 등록할 때 감시할 이벤트의 종류를 지정하기 위한 변수 아닌가요?

추가 질문으로...

epoll_wait()의 두번째 인자 events는, 내부적으로 루프를 돌면서 초기화 과정에서 등록한 FD에서 감시할 이벤트의 종류에 따라서 리턴값이 달라지지 않나요?
select()와 비교하자면 select()가 리턴된 후에는 readfd가 set 인지 writefd가 set 인지 검사하는 FD_ISSET() 함수가 있어서 어떤 이벤트인지 알수 있게 되는데, epoll은 그런것이 없는 듯 하여 말이죠.

질문이 장황하군요.

익명 사용자의 이미지

&연산해서 사용하시면 됩니다.

처음에 epoll_ctl Add에서 주는것과 epoll_wait에서 받아 오는 것은 서로 다른 것입니다.

Add에서 주는 event는 내가 체크할것 OUT,IN등을 나타내는것이고 event를 주면 그것은 epoll 내부적으로 저장되어 가지고 있습니다.

wait에서 받은 event는 현재 읽어야하는지 써야하는지를 알려주는 select에서의 FD와 같은 event입니다.

또한,
epoll_wait(..,event,epoll_size,..) 있을때

epoll_size라는것은 한번에 건져 올려 체크할 event 갯수입니다.

event_size 에 10개를 한번에 건져 올리겠다구 한다면 event 구조체는 10개만 정의해서 사용하시면 됩니다.

저도 epoll을 이용해서 지금 프로젝트 진행중입니다.

아주 좋은 넘입니다.(아직서비스단계는 아니지만 ^^)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.