poll() 함수에 대한 말씀을 조금 더 드리고 가도록 하겠습니다. 이렇게 글을 작성하는 이유는 제가 올려 드린 통신 라이브러리 중에 아래와 같은 내용이 있습니다.

  poll() 호출 후에 자료가 수신이 되면 on_poll_in() 함수를 호출하게 됩니다. on_poll_in() 함수에서는 프로그램에서 지정한 버퍼의 크기만큼 수신 자료를 받아 오는데, 만일 수신 버퍼 보다 더 많은 양의 데이터가 수신되었다면 어떻게 해야 할까요? 아래와 같이 while 문을 사용하여 모두 수신을 해야 할까요?

static void on_poll_in( rs232_t *sender)
{        
  char   buff[__MAX_BUFF_SIZE];
  int    sz_read;

   while( 1 )
   {
      sz_read = read( sender->fd, buff,__MAX_BUFF_SIZE);
      if ( 0 >= sz_read)                              // 읽어 들일 자료가 없다면 loop 밖으로
         break;
      else
         sender->on_read( sender, buff, sz_read);     // 읽어 들인 자료를 통신 객체에게 전달
   }
}

이 포스트에는 동영상이 준비되어 있습니다. 동영상을 보시려면 를 클릭하여 주십시오.

   동영상에서 보시는 바와 같이 수신된 자료가 프로그램에서 준비한 버퍼 보다 크더라도 poll()에서 읽지 못한 자료가 있다면 계속 POLL_IN을 알려 주기 때문에 계속해서 수신받은 자료를 읽어 들일 수 있다는 말씀이 되겠습니다.

  즉, 아래와 같이 while 문이 없어도, 그리고 읽어 들이는 버퍼가 수신된 자료보다 작아서 수신 자료를 모두 읽지 않고 POLL_IN 처리 루틴을 빠져 나와도 다음 poll()의 POLL_IN에 의해 계속해서 자료를 읽어 들일 수 있습니다.

static void on_poll_in( rs232_t *sender)
{        
   int   sz_read;

   if ( NULL == sender->on_read)
   {
      sz_read = read( sender->fd, __net_buff,__MAX_BUFF_SIZE);
      if ( 0 >= sz_read)                     // 자료 읽기에 실패했다면 에러 처리
         on_poll_err( sender)
   }
   else
       sender->on_read( sender);             // 자료 읽어 들이는 함수 호출
}