ÀÚÅõ¸®|ºí·Î±×|¹æ¸í·Ï   JAEN 
¾î¸°¹Ì¸£ À̾߱â
¾Æ¹«°Íµµ ÇÏÁö¾Ê´Â °ÍÀÇ Æí¾ÈÇÔ +
°Ë»öÇϱâ
¢Ã ºÐ·ù
ºÐ·ù Àüüº¸±â (838)
³¯ÀûÀÌ (229)
»ç¶÷°ú »ç¶÷ (62)
µÑ¸¸ÀÇ Á¤¿ø (8)
Çѱ¹°ú ÀϺ» (115)
¸ÀÀÖ´Â À̾߱â (82)
¿©Çà±â (42)
ÍïÜý (65)
Ã¥À» Àд٠(55)
´À³¢´Ù (45)
ÄÄÇ»ÆÃ (36)
¸®ºä/Á¤¸® (86)
û¾Æ (13)
¸µÅ©
Hitel KWU
°Ô½Ã±Û ¼øÀ§
¢Ò ÃÖ±Ù´ä±Û
¡× ÃÖ±Ù Æ®·¢¹é(À̾±â)
ÀýºÐÀÇ ³¯¿¡ µµÄì¿¡ ³»¸° ´«..
¾î¸°¹Ì¸£ À̾߱â
º×´ÙÀÇ °¡¸£Ä§°ú ÆÈÁ¤µµ
¾î¸°¹Ì¸£ À̾߱â
±³Åä(ÌÈÔ´) ¿©Çà - µÎ¹øÂ° ..
¾î¸°¹Ì¸£ À̾߱â
Locations of visitors to this page
add to HanRSS
add to google
Add to My Yahoo!
add to windows live




Linux °­Á #2 : linux epollÀ» ÀÌ¿ëÇÑ echo server 07/04/05 19:54

¿À·£¸¸¿¡ ȸ»ç¿¡¼­ linux °­Á¸¦ Á÷Á¢ÇÒ ÀÏÀÌ À־ ÀڷḦ Á¤¸®ÇغôÙ. linux´Â 2002³âµµ¿¡ ºñÇϸé Á¤¸» ¸¹ÀÌ ÁÁ¾ÆÁø °Í °°´Ù. epollÀ» ÀÌ¿ëÇØ¼­ Level Triggered¿Í Edge Triggered ¿¹Á¦¸¦ ÇÑ ¹ø ÀÛ¼ºÇغôÙ. ±ÞÁ¶ÇÑ ¼Ò½º¶ó Ʋ¸° ºÎºÐÀÌ ÀÖÀ»Áöµµ ¸ð¸£´Ï "ÃʽÉÀÚ" ºÐµéÀº Á¶½ÉÇϽöó. ^^


Á¦¸ñ: linux epollÀ» ÀÌ¿ëÇÑ echo server
- ÀÛ¼ºÀÚ: ¾î¸°¹Ì¸£ (http://chonga.pe.kr/blog)
- ¹®¼­À§Ä¡: http://chonga.pe.kr/blog/index.php?pl=919
- ÀÛ¼ºÀÏ: 20070405
- ¹®¼­ º¯°æ ÀÌ·Â :
20070405 ÃÊÆÇ ¸±¸®Áî
20070406 EPOLLONESHOT ¼³¸í Ãß°¡

¼±¾ð: º» ¹®¼­´Â ÀúÀÚÀÇ °³ÀÎÀûÀÎ ÀǰßÀÌ µé¾î°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÌ °÷¿¡ °ÔÀçµÈ ³»¿ëÀº »ó¾÷Àû ÆÇ´ÜÀ» À§ÇÑ ÀÚ·á·Î ÀÌ¿ëµÉ ¼ö ¾øÀ¸¸ç ±×·Î ÀÎÇÑ Ã¥ÀÓÀº ÀúÀÚ¿¡°Ô ¾ø½À´Ï´Ù.



1 °³¿ä
Linux kernel 2.6¿¡¼­ ³×Æ®¿öÅ© ¼º´É Çâ»óÀ» À§ÇØ Á¤½ÄÀ¸·Î ¸±¸®ÁîµÈ i/o À̺¥Æ® ÅëÁö ±â´ÉÀÎ epollÀ» ÀÌ¿ëÇÏ¿© echo serverÀÇ ¿¹¸¦ ÅëÇØ °£´ÜÇÑ °³¿ä¸¦ »ìÆìº¸µµ·Ï ÇÏÀÚ.

2 epollÀ̶õ?
Linux kernel 2.4 ÀÌÀüºÎÅÍ select, pollÀÇ ÇѰ踦 ±Øº¹Çϱâ À§Çؼ­ ½ÇÇèÀûÀÎ i/o ¸ðµ¨µéÀÌ Å×½ºÆ®µÇ±â ½ÃÀÛÇß´Ù. /dev/poll ȤÀº realtime signal(rtsignal), event poll µîÀÌ ±× ´ëÇ¥ÀûÀÎ ¿¹ÀÌ´Ù. ±× ¿ÍÁß¿¡ event pollÀ̶ó´Â À̸§À¸·Î ÁøÈ­µÇ±â ½ÃÀÛÇÑ °ÍÀÌ Áö±ÝÀÇ epollÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù.

3 epollÀÇ ¼³¸í
¸» ±×´ë·Î i/o À̺¥Æ®ÀÇ ÅëÁö±â´ÉÀ» Çϰí Àִµ¥, Å©°Ô 2°¡Áö ¸ðµå¸¦ Áö¿øÇÑ´Ù. Çϳª´Â Level Triggered(ÀÌÈÄ LT)ÀÌ°í ¶Ç Çϳª´Â Edge Triggered(ÀÌÈÄ ET)¶ó°í ÇÒ ¼ö ÀÖ´Ù. LT´Â »óÅÂÀÇ °ªÀ» °Ë»çÇÏ´Â ¹æ¹ýÀ̰í, ET´Â »óÅÂÀÇ º¯È­¸¦ °¨ÁöÇÏ´Â ¹æ¹ýÀÌ´Ù.

epollÀº ¿ì¼± ±âÁ¸ÀÇ select, poll°ú ¸¶Âù°¡Áö·Î socket(file descriptor)ÀÇ ¸ñ·ÏÀ» °ü¸®ÇÏ°í ±× °ÍÀ» ¾î¶»°Ô °Ë»çÇÏ´Â Áö¿¡ ´ëÇØ¼­´Â LT¿Í ETÀÇ ¹æ¹ýÀÌ ÀÖ´Ù°í º¸¸é Å©°Ô ´Ù¸£Áö ¾Ê´Ù. select¿Í pollÀÇ ¹æ¹ýÀº LTÀÇ ¹æ¹ýÀ̶ó°í º¸¸é µÈ´Ù. µû¶ó¼­ ±âÁ¸¿¡ ¸¸µé¾îÁø select, pollÀÇ ¼Ò½ºÄڵ带 epoll·Î ±×´ë·Î ¸¶À̱׷¹À̼ÇÇÏ´Â °æ¿ì¿¡´Â LT ¸ðµå·Î ÀÛ¾÷À» ÇÏ¸é ½±°Ô ¼öÁ¤À» ¸¶Ä¥ ¼ö ÀÖ´Ù.

3.1 epollÀÇ ÇÔ¼ö
epollÀ» À§ÇØ °£´ÜÈ÷ 3°¡Áö ÇÔ¼ö°¡ Á¦°øµÇ´Âµ¥, epoll °´Ã¼¸¦ »ý¼ºÇÏ´Â epoll_create¿Í epoll¿¡ socket ¸ñ·ÏÀ» Á¦¾îÇÏ´Â epoll_ctl, ±×¸®°í socket ¸ñ·ÏÀÇ À̺¥Æ®¸¦ °¨ÁöÇÏ´Â epoll_wait´Ù.
±×¸®°í struct epoll_event°¡ ÀÖ´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº man-page·ÎºÎÅÍ »ìÆìº¸½Ã±â¸¦ ¹Ù¶õ´Ù.

3.1.1 struct epoll_event
typedef union epoll_data {
     void *ptr;
     int fd;
     __uint32_t u32;
     __uint64_t u64;
} epoll_data_t;

struct epoll_event {
     __uint32_t events;  /* Epoll events */
     epoll_data_t data;  /* User data variable */
};


3.1.2 °ü·Ã ÇÔ¼ö
int epoll_create(int size)
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)


3.2 epollÀÇ Level Triggered ¸ðµå¿Í Edge Triggered ¸ðµå
epollÀº ±âÁ¸ socket ¸ñ·ÏÀ» °®°í ÀÖ´Â »óȲ¿¡¼­ ±× ¸ñ·Ï Áß¿¡ "Àбâ/¾²±â/¿¹¿Ü »óȲ" µîÀÇ À̺¥Æ®µéÀÌ ¹ß»ýÀ» °¨ÁöÇØ¼­ °¢°¢¿¡ ¸Â´Â 󸮸¦ ÇÏ°Ô µÇ´Â °ÍÀº °øÅëÀÌÁö¸¸, LT¿Í ETÀÇ ¸ðµå¿¡ µû¶ó À̺¥Æ®¸¦ °¨ÁöÇÏ´Â ¹æ½ÄÀÌ ´Þ¶óÁø´Ù°í º¼ ¼ö ÀÖ´Ù. ´Ù½Ã LT¸¦ ¼³¸íÇÏÀÚ¸é epoll¿¡ µî·ÏµÈ socket ¸ñ·Ïµé °¡¿îµ¥, À̺¥Æ®°¡ ¹ß»ýµÈ ºÎºÐÀÌ Ã¼Å©°¡ µÇ¾î ÀÖ´Ù°í °¡Á¤Çϸé À̺¥Æ®°¡ À̹ø ÅÏ¿¡ ¹ß»ý(epoll_wait°¡ ±ú¾î³²)ÇÏ´õ¶óµµ 󸮰¡ µÇÁö ¾Ê¾Ò´Ù¸é ´ÙÀ½ ÅÏ¿¡ ´Ù½Ã °¨ÁöµÈ´Ù°í ÀÌÇØÇÏ¸é ½±°Ú´Ù. À̸¦ ±âÁØÀ¸·Î ET¸¦ ´Ù½Ã ¼³¸íÇϸé À̹ø ÅÏ¿¡ Àбâ À̺¥Æ®°¡ ¹ß»ýÇß´Ù°í Çϸé À̹ø ÅÏ¿¡ Àб⠵¿ÀÛÀ» ¸ðµÎ ¿Ï·áÇÏÁö ¾Ê´Â´Ù¸é ´Ù½Ã epoll_wait·Î À̺¥Æ®¸¦ °¨ÁöÇÏ´Â ÇÔ¼ö°¡ È£ÃâµÇ´õ¶óµµ ÀÌÀü µ¿ÀÛ¿¡ ÀÇÇÑ À̺¥Æ® °¨Áö´Â ºÒ°¡´ÉÇØÁø´Ù. µû¶ó¼­ LT´Â »óۨÁö, ET´Â º¯°æ°¨Áö¶ó°í ÇÒ ¼ö ÀÖ°Ú´Ù. ¹°·Ð ÀϹÝÀûÀ¸·Î º¯°æ¸¸À» °¨ÁöÇÏ´Â ETÀÇ °æ¿ì°¡ ¼º´ÉÀÌ ´õ ¶Ù¾î³ª´Ù. Áß¿äÇÑ ºÎºÐÀ¸·Î ETÀÇ °æ¿ì¿¡´Â ¹Ýµå½Ã non blocking socketÀ» »ç¿ëÇØ¾ßÇÑ´Ù.

¸¶Áö¸·À¸·Î ETÀÇ °æ¿ì¿¡´Â Ãß°¡ÀûÀ¸·Î ÇѰ¡Áö ¸ðµå¸¦ ´õ Áö¿øÇϴµ¥, EPOLLONESHOTÀ̶ó´Â ¸ðµå´Ù. ÀÌ °ÍÀº epollÀÌ °ü¸®ÇÏ´Â socket ¸ñ·Ï¿¡ ÇÑ ¹ø µî·ÏÀÌ µÈ ÀÌÈÄ¿¡, À̺¥Æ® °¨Áö¿¡ ÀÇÇØ °ËÃâÀÌ µÇ´Â °æ¿ì, socket ¸ñ·Ï¿¡¼­ À̺¥Æ®¸¦ ¹ÞÁö ¾Êµµ·Ï ¼³Á¤ÀÌ º¯°æµÇ´Â °ÍÀ¸·Î one shotÀ̶ó´Â Ç¥ÇöÀ» ¾²°í ÀÖ´Ù. ÀÌ °æ¿ì´Â À̺¥Æ®¸¦ °ËÃâÇÑ ÀÌÈÄ¿¡, ´Ù¸¥ ¾²·¹µå¿¡ ÇØ´ç socket¿¡ ´ëÇØ¼­ read ÀÛ¾÷À» ¸Ã±â°í ³¡³­ °æ¿ì¿¡ ´Ù½Ã epollÀÇ socket ¸ñ·Ï¿¡¼­ À̺¥Æ®¸¦ ¹ÞÀ» ¼ö ÀÖµµ·Ï º¯°æÇÏ´Â ±¸Á¶ÀÇ ¼­¹ö ÇÁ·Î±×·¥¿¡¼­ À¯¿ëÇÑ ±â´ÉÀ̶ó°í ÇÒ ¼ö ÀÖ°Ú´Ù. ÀÌ ±â´ÉÀº client ·Î¼­ µ¿ÀÛÇÏ´Â °æ¿ì¿¡ non-blocking socket ¼³Á¤Çϰí epollÀÇ ¸ñ·Ï¿¡ ³ÖÀº ÈÄ¿¡ connect¸¦ ÇÑ ÈÄ¿¡ Àбâ À̺¥Æ®(Á¢¼ÓµÊ)¸¦ 1ȸ °Ë»çÇÏ´Â ±â´ÉÀ¸·Î »ç¿ëµÇ¾îµµ µÉ µí ÇÏ´Ù.

4 epollÀÇ ½ÇÀü ¿¹
echo serverÀÇ ±¸ÇöÀ» ÅëÇØ epollÀÇ ½ÇÀü ¿¹¸¦ »ìÆìº¸µµ·Ï ÇÏÀÚ. ¿ì¼± LT, ET, ±×¸®°í ETÀÇ ONESHOT±â´ÉÀ» ¸ðµÎ ÀÌ¿ëÇÏ¿© ´ÙÀ½°ú °°Àº ¿¹Á¦ Äڵ带 °£´ÜÈ÷ ¸¸µé¾î º¸¾Ò´Ù. LTÀÇ °æ¿ì´Â blocking socketÀ¸·Î ±¸ÇöÇß°í, ETÀÇ °æ¿ì´Â non-blocking socketÀ¸·Î ±¸ÇöµÇ¾ú´Ù.

4.1 makefileÀÇ ¿¹
make / LT ¸ðµåÀÇ echo server ºôµå
make echoserver2-et / ET ¸ðµåÀÇ echo server ºôµå
make echoserver2-etoneshot / ET ¸ðµåÀÇ ONESHOT ±â´ÉÀÇ echo server ºôµå

CC:=gcc
CFLAGS:=
LIBS:=
all:
        $(CC) $(CFLAGS) -g -o epoll-echoserver2 epoll-echoserver2.c $(LIBS)
echoserver2-et:
        $(CC) $(CFLAGS) -DUSE_ET -g -o epoll-echoserver2 epoll-echoserver2.c $(LIBS)
echoserver2-etoneshot:
        $(CC) $(CFLAGS) -DUSE_ET -DUSE_ETONESHOT -g -o epoll-echoserver2 epoll-echoserver2.c $(LIBS)


4.2 echoserverÀÇ ¿¹ : epoll-echoserver2.c
¼Ò½ºÀÇ °æ¿ì select, poll°ú Å©°Ô ´Ù¸£Áö ¾Ê´Ù°í º¼ ¼ö ÀÖ´Ù. accept socketÀ» ¸¸µé°í epoll¿¡ Àбâ À̺¥Æ®¸¦ ¼³Á¤ÇÑ ÈÄ¿¡ epollÀÇ socket ¸ñ·Ï¿¡ ÃÖÃÊ¿¡ Ãß°¡½Ã۰í epoll_waitÀÇ loop·Î µé¾î¿Í¼­ accept socketÀÎÁö ÀÏ¹Ý socketÀÎÁö¿¡ µû¶ó do_accept()¿Í do_use_fd()ÀÇ ÇÔ¼ö·Î ºÐ±â È£ÃâÇß´Ù. ³»¿ë Áß¿¡¼­ ´«¿©°Ü º¼ ºÎºÐÀº struct epoll_eventÀε¥, events(Àбâ,¾²±â, ET¸ðµå ¼³Á¤ µî)¿Í dataÀÌ´Ù. dataÀÇ °æ¿ì¿¡´Â intŸÀÔÀ̳ª void* ŸÀÔÀ» ¸¶À½´ë·Î ¼³Á¤Çؼ­ »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. ¿©±â¼­´Â int ŸÀÔÀ¸·Î socketÀÎ file descriptor¸¦ ³Ö¾î¼­ ó¸®ÇÑ´Ù. ½ÇÁ¦·Î °³¹ßÀÚ°¡ ¿øÇÏ´Â »ç¿ëÀÚ °´Ã¼ÀÇ Å¸ÀÔÀ» µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍ·Î »ç¿ëÀÚ °ü¸® ŸÀÔÀ» ¸¸µé°í struct epoll_eventÀÇ data¿¡ ³Ö¾îÁÙ ¼öµµ ÀÖ´Ù.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>


#define EPOLL_SIZE 60
#define EPOLL_EVENT_SIZE 100

int
setnonblock (int sock)
{
  int flags = fcntl (sock, F_GETFL);
  flags |= O_NONBLOCK;
  if (fcntl (sock, F_SETFL, flags) < 0)
    {
      perror("fcntl, executing nonblock error");
      return -1;
    }
  return 0;
}

int
settcpnodelay (int sock)
{
  int flag = 1;
  int result = setsockopt (sock,    /* socket affected */
               IPPROTO_TCP,    /* set option at TCP level */
               TCP_NODELAY,    /* name of option */
               (char *) &flag,    /* the cast is historical  cruft */
               sizeof (int));    /* length of option value */
  return result;
}

int
setreuseaddr(int sock)
{
  int flag = 1;
  int result = setsockopt (sock,    /* socket affected */
               SOL_SOCKET,    /* set option at TCP level */
               SO_REUSEADDR,    /* name of option */
               (char *) &flag,    /* the cast is historical  cruft */
               sizeof (int));    /* length of option value */
  return result;
}



int
get_portnumber_from_arg(int argc, char **argv)
{
  // get port number
  if (argc == 2)
    {
      return atoi(argv[1]);
    }
  else
    {
      return -1;
    }
}

int
init_epoll (int eventsize)
{
  int efd;

  // init epoll
  if ((efd = epoll_create (eventsize)) < 0)
    {
      perror ("epoll_create (1) error");
      return -1;
    }
  return efd;
}

int
init_acceptsock (unsigned short port)
{
  struct sockaddr_in addr, clientaddr;

  int clilen = sizeof (clientaddr);
  int sfd = socket (AF_INET, SOCK_STREAM, 0);

  if (sfd == -1)
    {
      perror ("socket error :");
      close (sfd);
      return -1;
    }

  setreuseaddr(sfd);

  addr.sin_family = AF_INET;
  addr.sin_port = htons (port);
  addr.sin_addr.s_addr = htonl (INADDR_ANY);
  if (bind (sfd, (struct sockaddr *) &addr, sizeof (addr)) == -1)
    {
      close (sfd);
      return -2;
    }
  listen (sfd, 5);
  return sfd;
}

int
do_use_fd (int efd, struct epoll_event ev)
{
  int readn;
  int sendflags = 0;
  char buf_in[1024] = { '\0' };
  int cfd = ev.data.fd;

  //printf("DoUseFD\n");
#ifdef USE_ET
  int sizen = 0;
  char readbuf[256] = { '\0' };
  while(1) {
      readn = read (cfd, readbuf, 255);
    if (readn <0 ) {
          if (EAGAIN == errno ) {
            break;
            }
              do_del_fd(efd, cfd);
          close (cfd);
          printf ("Close fd %d by %d\n", cfd,readn);
          perror("Closed");
          return -1;
    }
    sizen += readn;
        if (sizen >= 1024) {
           do_del_fd(efd, cfd);
           close (cfd);
       printf ("Close buffer full fd %d by %d\n", cfd,readn);
       perror("Closed");
       return -1;
        }
        memcpy(buf_in,readbuf,readn);
  }
  printf ("read data %d, %s", sizen, buf_in);
  send (cfd, buf_in, strlen (buf_in), sendflags);

#ifdef USE_ETONESHOT
  // re-set fd to epoll
  do_modify_fd(efd, cfd);
#endif // USE_ETONESHOT

#else //#ifdef USE_ET

  //memset (buf_in, 0x00, 256);
  readn = read (cfd, buf_in, 255);
// if it occured ploblems with reading, delete from epoll event pool and close socket
  if (readn <= 0)
    {
      do_del_fd(efd,cfd);
      close (cfd);
      printf ("Close fd ", cfd);
    }
  else
    {
      printf ("read data %s", buf_in);
      send (cfd, buf_in, strlen (buf_in), sendflags);
    }
#endif //#ifdef USE_ET
  return 1;
}

int
do_accept (int efd, int sfd)
{
  int cfd;
  int clilen;
  struct sockaddr_in addr, clientaddr;

  printf("Accepted\n");
  cfd = accept (sfd, (struct sockaddr *) &clientaddr, &clilen);
  if (cfd < 0)
    {
      perror ("Accept error");
      return -1;
    }

#ifdef USE_ET
  setnonblock (cfd);
#endif // USE_ET
  settcpnodelay (cfd);

  do_add_fd(efd, cfd);

  return cfd;
}

int
do_add_fd(int efd, int cfd)
{
  struct epoll_event ev;

  ev.events = EPOLLIN;
#ifdef USE_ET
  ev.events |= EPOLLET;
#ifdef USE_ETONESHOT
  ev.events |= EPOLLONESHOT;
#endif // USE_ETONESHOT
#endif // USE_ET
  ev.data.fd = cfd;
  return epoll_ctl (efd, EPOLL_CTL_ADD, cfd, &ev);
}

// fixme
int
do_modify_fd(int efd, int cfd)
{
  struct epoll_event ev;

  ev.events = EPOLLIN;
#ifdef USE_ET
  ev.events |= EPOLLET;
#ifdef USE_ETONESHOT
  ev.events |= EPOLLONESHOT;
#endif // USE_ETONESHOT
#endif // USE_ET
  ev.data.fd = cfd;
  return epoll_ctl (efd, EPOLL_CTL_MOD, cfd, &ev);
}


int
do_del_fd(int efd, int cfd)
{
  struct epoll_event ev;

  return epoll_ctl (efd, EPOLL_CTL_DEL, cfd, &ev);
}


// main
int
main (int argc, char **argv)
{
  const int poolsize= EPOLL_SIZE;
  const int epollsize= EPOLL_EVENT_SIZE;
  struct epoll_event *events;
  struct epoll_event ev;
  int sfd, efd;
  int i;
  int max_got_events;
  int result;
  int port;

  port = get_portnumber_from_arg(argc,argv);
  if (port < 0)
    {
      puts("I need 1 argument(as a listen port)");
      return 1;
    }

  efd = init_epoll (epollsize);
  if (efd < 0)
    {
      perror ("init_epoll error");
      return 1;
    }

  // init pool
  events = (struct epoll_event *) malloc (sizeof (*events) * poolsize);
  if (NULL == events)
    {
      perror ("epoll_create (0) error");
      return -1;
    }

  sfd = init_acceptsock (port);
  if (sfd < 0)
    {
      perror ("init_acceptsock error");
      return 1;
    }

  printf("Running Server port %d\n",port);
  result = do_add_fd(efd,sfd);
  if (result < 0)
    {
      perror ("epoll_ctl error");
      return 1;
    }

  while (1)
    {
      max_got_events = epoll_wait (efd, events, poolsize, -1);
      for (i = 0; i < max_got_events; i++)
    {
      if (events[i].data.fd == sfd)
        {
          do_accept (efd, sfd);
        }
      else
        {
          do_use_fd (efd, events[i]);
        }
    }
    }
  return 1;
}


5 Âü°í ¹®Çå
- man page : man epoll
- google ¿¡¼­ epoll °Ë»ö
- wikipedia ¿¡¼­ epoll °Ë»ö
¡× ¿î ÁÁÀ¸¸é ¾î¿ï¸®´Â ±Û ã±â :
  10/03/12 ¿¡ºñ½º ¸ÆÁÖ ±â³ä°ü¿¡¼­ ¼¼»óÀ» ¾ò´Ù.
  10/02/23 ±è¹ä ¸¸µå´Â ƲÀÇ Àç¹ß°ß!
  10/02/22 ÀϺ»ÀÇ WIMAX(WIBRO) ¼­ºñ½º 2ÁÖ°£ ¹«·á »ç¿ë
Creative Commons License ÀúÀÛ±ÇÇ¥½Ã: ÀÌ ÀúÀÛ¹°Àº Å©¸®¿¡ÀÌÆ¼ºê Ä¿¸ÕÁî ÄÚ¸®¾Æ ÀúÀÛÀÚÇ¥½Ã-ºñ¿µ¸®-º¯°æ±ÝÁö 2.0 ´ëÇѹα¹ ¶óÀ̼¾½º¿¡ µû¶ó ÀÌ¿ëÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.
trackback address :: http://chonga.pe.kr/blog/rserver.php?mode=tb&sl=919&tm=1262098800
(¡ÚÀÌ Æ®·¢¹é ÁÖ¼Ò´Â ½ºÆÔ Â÷´ÜÀ» À§ÇØ ÆäÀÌÁö °»½Å ÈÄ ¾à 2Àϰ£ À¯È¿ÇÕ´Ï´Ù.)
ÃÖÀÍÇÊ 09/12/31 12:59 x
¾öû³ª°Ô Àß º¸°í °©´Ï´Ù!! °¨»çÇÕ´Ï´Ù.

À̸§ ::   ºñ¹Ð¹øÈ£ ::  
ȨÆäÀÌÁö ::  



[1] ... [18][19][20][21][22][23][24][25][26] ... [36]


1995-2010 ¾î¸°¹Ì¸£(email¡ã) ¡¤ ¹ýÀû¾Ë¸² | MW 1708Àϰ, WR 1451Àϰ