'비동기'에 해당되는 글 1건

/*
  Copyright (C) Information Equipment co.,LTD
  All rights reserved.
  Code by JaeHyuk Cho <mailto:minzkn@infoeq.com>
  CVSTAG="$Header$"
*/

#include <sys/param.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

#ifndef __USE_GNU
#define __USE_GNU __USE_GNU
#endif
#include <fcntl.h>

void DoSignalIO(int s_Signal)
{ fprintf(stdout, "%s : s_Signal = %d\n", __FUNCTION__, s_Signal); }

int main(void)
{
int s_Handle;
s_Handle = open("/dev/stdin", O_RDONLY);
s_Handle = s_Handle == (-1) ? 0 : s_Handle;
if(s_Handle != (-1))
{
  struct siginfo s_SignalInfo;
  sigset_t s_SignalSet;
  struct sigaction s_SignalAction;
  int s_Check, s_ReadBytes, s_Index, s_IsContinue, s_Prompt, s_CursorIndex;
  unsigned char s_Buffer[ 32 << 10 ];
  char s_Cursor[] = {'-', '/', '|', '\\'};

  /* Handler 준비 */
  sigemptyset(&s_SignalSet);
  sigaddset(&s_SignalSet, SIGRTMIN);
  sigprocmask(SIG_BLOCK, &s_SignalSet, (sigset_t *)0);

  sigemptyset(&s_SignalAction.sa_mask);
  s_SignalAction.sa_flags = SA_SIGINFO;
  s_SignalAction.sa_restorer = NULL;
  s_SignalAction.sa_handler = DoSignalIO;

  /* ASync fd 설정 */
  fcntl(s_Handle, F_SETFL, O_RDONLY | O_ASYNC | O_NONBLOCK);
  fcntl(s_Handle, F_SETSIG, SIGRTMIN);
  fcntl(s_Handle, F_SETOWN, getpid());

  s_IsContinue = 1;
  if(sigaction(SIGRTMIN, &s_SignalAction, 0) != (-1))
  { /* Handler 등록 */
   s_Prompt = 1;
   s_CursorIndex = 0;
   do
   {
    if(s_Prompt == 1)
    { /* 프롬프트 */
     fprintf(stdout, "\rInput RTS message >>> "); fflush(stdout);
     s_Prompt = 0;
    }
    else
    { /* 심오한 커서 */
     fprintf(stdout, " %c\b\b", s_Cursor[((s_CursorIndex++) / 10) % sizeof(s_Cursor)]); fflush(stdout);
     usleep((1000 / HZ) * 1000); /* CPU 부하 균형 - x86계열엣서는 10ms */
    }
    s_Check = sigwaitinfo(&s_SignalSet, &s_SignalInfo);
    if(s_Check == SIGRTMIN)
    { /* 입력한게 있다고 엽구리 찌르네 */
     if(s_SignalInfo.si_fd == s_Handle &&( (s_SignalInfo.si_code == POLL_IN) || (s_SignalInfo.si_code == SI_QUEUE) ))
     { /* 진짜 입력한거 맞어? */
      s_ReadBytes = read(s_Handle, &s_Buffer[0], sizeof(s_Buffer) - 1);
      if(s_ReadBytes > 0)
      { /* 뭔가 있어 */
       for(s_Index = 0;s_Index < s_ReadBytes;s_Index++)fprintf(stdout, "[0x%02x]", s_Buffer[s_Index]);
       fprintf(stdout, "\n");
       s_Prompt = 1;
      }
     }
    }
    else fprintf(stdout, "Check = %d\n", s_Check);
   }while(s_IsContinue == 1);
  }
  if(s_Handle > 2)close(s_Handle);
}
return(1);
}

/* vim: set expandtab: */
/* End of source */
크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/91

댓글을 달아 주세요