  The Linux Serial Programming HOWTO
  by Peter H. Baumann, Peter.Baumann@dlr.de
  v1.0, 22 January 1998
  P, fujiwara@linux.or.jp
  26 February 1998

  ̕ł́CLinux }ṼVA|[ggʐMvȌ
  ܂D
  ______________________________________________________________________

  ڎ

  1. ͂߂
     1.1 쌠ɂ
     1.2 {̍ŐVł̓@
     1.3 tB[hobN

  2. ͂߂Ă݂܂傤
     2.1 fobO̕@
     2.2 |[g̐ݒ
     2.3 VAfoCXɂ͂̊TO
        2.3.1 JmjJ͏
        2.3.2 JmjJ͏
        2.3.3 񓯊
        2.3.4 ͂̓͑҂

  3. vO
     3.1 JmjJ͏
     3.2 JmjJ͏
     3.3 񓯊
     3.4 ̓͂̓͑҂

  4. ̏
  5. Rgr[V

  ______________________________________________________________________

  1.  ͂߂

  { Linux Serial Programming HOWTO łDLinux ̃VA|[g
  gāC̃foCX/Rs[^ƒʐMvȌ
  ܂DJmjJ I/O(sPʂł̑M)C񓯊 I/OC\[X̓
  ͑҂́CقȂ^Cv̎@܂D

  {ł́CVA|[g̐ݒ@͐܂DɂẮC
  Greg Hankins ̏ꂽ Serial-HOWTO D

  ̓VAʐM̐̕Ƃł͂܂񂪁CVAʐMɊւv
  WFNgŖĂ܂D{ŏЉTvR[h́C
  LDP vO}[YKCh
  (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz yу~[TCg) 'examples' fBNg
  肷邱Ƃł miniterm ɗR̂łD

  1997N6ɂ̕ĂC͌ڋq̓sɂ WindowsNT g
  悤ɂȂC֘Am[߂邱Ƃł܂łD{ɔf
  ܂̂ŁCRgΐ񑗂Ă(tB[hobN̏͂Q
  )Ddpł悢̂ɂĂ΁C[Œm
  点ĂD

  SẴ̗eXǵCi386 x[X Linux 2.0.29 ōs܂D

  1.1.  쌠ɂ

  Linux Serial-Programming-HOWTOPeter Baumann ̒앨ł(copyright
  (C) 1997)DLinux HOWTO ́C̒쌠\ςȂC
  ꕔ邢͑ŜCCӂ̓dqIEIfBA֕yєzz邱
  ł܂DƓIzz͔F߂ĂC܂}Ă܂DC
  ̂悤Ȕzz̏ꍇɂ́C҂ւ̘A邱Ƃ]܂D

  |ChCLinux HOWTO ܂ޕҏW͂̒쌠\ɏ]Ȃ
  ΂Ȃ܂D܂CHOWTO hʕCɐǉ
  Ĕzz邱Ƃ͂ł܂DC̏̉ł̋KɗO
  F߂邱Ƃłꍇ܂DȉɃAhX Linux HOWTO 
  bɑkĂD

  ȒPɌ΁CX͂̏ł邾̌oHōL߂ƎvĂ
  ܂DCHOWTO ̒쌠͕ێ邱ƂƁCHOWTO Ĕzz
  SĂ̕@łΒm点Ă炦邱Ƃ]Ă܂D

  ^_΁CLinux HOWTO ̐bł gregh@sunsite.unc.edu 
  dq[őkĂD

  1.2.  {̍ŐVł̓@

  Serial-Programming-HOWTO ̍ŐVł
  ftp://sunsite.unc.edu:/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO
  yсC̃~[TCgœł܂DPostScript  DVI ̌`̕
  other-formatsfBNgɂ܂D܂C
  http://sunsite.unc.edu/LDP/HOWTO/Serial-Programming-HOWTO.html ɂ
  ܂CɈxcomp.os.linux.answersj[XO[vɂe
  D

  1.3.  tB[hobN

  CCRgCāCǉȂǂ΁CM҂ɂm点
  D̕ǂ̂ɂƎvĂ܂D悭Ȃ
  Cƕ₷ł镔m点ĂDM҂ɘA
  ɂPeter.Baumann@dlr.de֓dq[oĂDdq[
  ۂɂ́Cǂ Serial-Programming-HOWTO ̃o[W(̓̕o[
  W1.0ł)ĂD

  : {̍ŐVłJF vWFNgz[y[W œł܂D
  C󂪂Ζ҂̕փ[oĂD

  2.  ͂߂Ă݂܂傤

  2.1.  fobO̕@

  ȂR[hfobO邽߂̍łǂ@́CLinux }V
  pӂC̃Rs[^kfP[uŐڑ邱Ƃ
  Dminiterm(LDP vO}[YKCh
  (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz 'examples'fBNgɂ܂)gāC
   Linux }V֕𑗂Ă݂܂傤Dminiterm ͔ɊȒPɃR
  pCłCL[{[h͂VA|[goRł̂܂(raw)
  DCdefine  #define MODEMDEVICE "/dev/ttyS0"̓̕`Fb
  NȂĂ͂Ȃ܂D́̕CP[uŐڑ̂ COM1 ł
   ttyS0CCOM2łttyS1̂悤ɐݒ肵܂D̃eXgő厖ȓ_
  ́CSĂ͂̂̕܂(raw, o͏)M邱ƂłDڑ
  eXgƂ́C̃}V miniterm sCL[{[h@
  łDЕ̃}Vœ͂ꂽ́C̃}Vŏo͂
  D̋tłD͂́C͂̃}V̉ʂɂ̓G
  R[܂D

  kfP[u삷ɂ́CTxD(M)RxD(M)̌NX
  ܂DP[uɂĂ̏ڂ́CSerial-HOWTO ̑7͂ɂ
  D

  gp̃VA|[g2̂Ȃ΁C̃Rs[^ł̃eX
  gs邱Ƃł܂D̏ꍇ́C2̉zR\[łꂼ
  miniterm s܂DVA}EXOăVA|[g󂯂
  ɂ́C/dev/mouse邱ƂYȂ悤ɂ܂傤D}`|[
  gVAJ[hgĂꍇɂ́Cݒ肪ƂmF܂
  DM҂͎̃}VŊԈݒĂ߂ɁC̃}VŃe
  Xg܂삷ƂԂɂȂƂ܂D̐ݒ
  ő̃Rs[^ɐڑɂ́CĂ܂܂D 2̃v
  O1̃Rs[^œƂ́CSɔ񓯊Ƃ͌܂
  D

  2.2.  |[g̐ݒ

  /dev/ttyS*ƂfoCX͒[ Linux }VɌq߂̂̂ŁCʐM
  n߂͒[ɍ킹ݒ肪s܂D̓_ raw foCX
  gĒʐMvOsꍇɂ́CӂĂȂ΂Ȃ܂D
  Ⴆ΁CLN^GR[obN悤ɃVA|[gݒ
  Ă܂Cʏf[^M̂߂ɂ͂̐ݒ͕ύXȂ΂
  D

  SẴp[^̓vOŊȒPɐݒł܂Dݒ̓wb_t@C
  <asm/termbits.h>Œ`Ă termios \̂ɕۑ܂D

       #define NCCS 19
       struct termios {
               tcflag_t c_iflag;               /* input mode flags */
               tcflag_t c_oflag;               /* output mode flags */
               tcflag_t c_cflag;               /* control mode flags */
               tcflag_t c_lflag;               /* local mode flags */
               cc_t c_line;                    /* line discipline */
               cc_t c_cc[NCCS];                /* control characters */
       };

  <asm/termbits.h> t@Cɂ́CtO̒`SċLqĂ
  Dc_iflag tOɂ͓̓[h̃tO܂܂ĂCSĂ
  ͏w肵܂D͏Ƃ́CfoCX瑗ꂽLN^
  ́CreadœǂݏoOɏ邱ƂłƂƂłDl
  ɁCc_oflag͏o͏܂D c_cflaǵC{[[g╶̃rb
  gCXgbvrbgȂǂ̃|[gݒL^Ă܂Dc_lflag ̃[
  J[htÓCGR[邩ǂCvOɃVOi
  邩ǂw肵܂DŌɁCz c_cc ł́Ct@CI
  [Cstop ̐䕶`܂D䕶̃ftHgl
  <asm/termios.h> Œ`Ă܂DetOɂẮCIC}
  jA termios(3) ɐ܂D\ termios POSIX 
  VXeł͗pȂC c_linevf܂ł܂D

  2.3.  VAfoCXɂ͂̊TO

  ł́C3̈قȂނ̓͂̊TO܂DpړIɏ]āC
  K؂Ȃ̂IĂDŜ擾̂ɁC1ǂݍ
  ̃[vgƂ͂łׂłD͂ƂC
  ݍݎ read SG[o͂Ȃ̂ɂ炸C
  Ă܂Ƃ܂D

  2.3.1.  JmjJ͏

  ͒[ɑ΂Ă̒ʏ̏[hłC̃foCXƂ̒ʐM̎
  ֗łDSĂ͍̓͂sPʂŏ܂D܂Cread ͓͂1s
  Ŝ݂̂ԂĂ܂DftHgł́CsNL(ASCII LF)Ct@CI
  [CsI[̂ꂩŏI܂DW̐ݒł́CCR (DOS/Windows 
  ftHg̍sI[)͍s̏I[Ƃ͂Ȃ܂D

  JmjJ͏ł́C(erase)CP̍폜(delete word)C̍
  o(reprint characters)CCRNLւ̕ϊȂǂƂł܂D

  2.3.2.  JmjJ͏

  JmjJ͏́Cread Ɍ܂̕@ŁCL
  N^^C}𗘗p邱Ƃł܂D̃[h̓AvP[V
  ܂̃LN^ǂݍގCڑfoCXʂ̕
  ĂꍇɎgp܂D

  2.3.3.  񓯊

  L2̃[h́Cyє񓯊[hŎgƂł܂DftH
  ǵC͂܂܂ read ubN铯[hłD
  [hł́Cread ͑ɏICœǂݍ݂ɃvO
  ɃVOi܂D̃VOíCVOinhgĎ
  ܂D

  2.3.4.  ͂̓͑҂

  ͕ʂ̓̓[hƂ킯ł͂܂񂪁C̃foCX
  ɕ֗łDM҂̃AvP[Vł́CTCP/IP \PbgoR̓͂Ƒ
  ̃Rs[^̃VAڑoR̓͂[IɓɈĂ
  DȉɎvOł́CقȂ2̓̓\[X̓͑҂
  s܂DЕ̃\[X̓͂\ɂȂƁC̓͂Cv
  O͎̓͂҂܂D

  ȉɎAv[`͂ƕGɌ܂CLinux ̓}`vZb
  VO OS ł邱ƂYĂ͂܂DselectVXeR[͓͑
  ̊Ԃ CPU ɕׂ^܂񂪁C[vg͑҂sƁC
  ɎsĂ鑼̃vZXxȂĂ܂܂D

  3.  vO

  SĂ̗ miniterm.c ôłDs͂̃obt@ 255
  ɐĂ܂D́CJmjJ͏̍ő啶Ɠ
   (<linux/limits.h> 邢 <posix1_lim.h>Q)D

  ꂼ̓̓[h̎gɂĂ̓vÕRgĂ
  DvO͏\ǂ݂ȂƎv܂DJmjJ̓[h̗
  ɂ͈ԏڂRgtĂ܂DႢ邽߂ɁC̗ɂ
  Ă̓JmjJ̓[hƂ̑_Ă܂D

  ͊Sł͂܂񂪁CECoėŎCȂ̖ړIɍ
  KĂD

  gpVA|[gɂ́CK؂ȃp[~bV^̂YȂ
  (: chmod a+rw /dev/ttyS1)D

  3.1.  JmjJ͏

  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <termios.h>
  #include <stdio.h>

  /* <asm/termbits.h> Œ`Ă{[[g̐ݒD
  <termios.h>CN[hD */
  #define BAUDRATE B38400
  /* K؂ȃVA|[gw悤ɁC̒`ύXD*/
  #define MODEMDEVICE "/dev/ttyS1"
  #define _POSIX_SOURCE 1  /* POSIX ̃\[X */

  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    char buf[255];
  /*
    ǂݏ̂߂ɃffoCXI[vDmCYɂ CTRL-C
    ܂ܔĂڑ؂Ȃ悤ɁCtty ͂ȂD
  */

  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
   if (fd <0) {perror(MODEMDEVICE); exit(-1); }

   tcgetattr(fd,&oldtio); /* ݂̃VA|[g̐ݒҔ*/
   bzero(&newtio, sizeof(newtio)); /* V|[g̐ݒ̍\̂NA */

  /*
    BAUDRATE: {[[g̐ݒDcfsetispeed  cfsetospeed gpłD
    CRTSCTS : o͂̃n[hEFAt[ (KvȌSĂĂP[
              ugꍇ̂݁DSerial-HOWTO 7͂QƂ̂)
    CS8     : 8n1 (8 rbgCmpeBCXgbvrbg 1)
    CLOCAL  : [JڑCfȂ
    CREAD   : M(receiving characters)LɂD
  */
   newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

  /*
    IGNPAR  : peBG[̃f[^͖
    ICRNL   : CR  NL ɑΉ(sȂƁC̃Rs[^
              CR ͂ĂC͂IɂȂȂ)
    ȊO̐ݒł́CfoCX raw [hł(̓͏͍sȂ)
  */
   newtio.c_iflag = IGNPAR | ICRNL;

  /*
   Raw [hł̏o
  */
   newtio.c_oflag = 0;

  /*
    ICANON  : JmjJ͂Lɂ
    SẴGR[𖳌ɂCvOɑ΂ăVOi͑点Ȃ
  */
   newtio.c_lflag = ICANON;

  /*
    SĂ̐䕶
    ftHgl /usr/include/termios.h Ε邪CRgɏ
    Ă̂ŁCł͌Kv͂ȂD
  */
   newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
   newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
   newtio.c_cc[VERASE]   = 0;     /* del */
   newtio.c_cc[VKILL]    = 0;     /* @ */
   newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
   newtio.c_cc[VTIME]    = 0;     /* LN^ԃ^C}gȂ */
   newtio.c_cc[VMIN]     = 1;     /* 1܂ŁCǂݍ݂ubN */
   newtio.c_cc[VSWTC]    = 0;     /* '\0' */
   newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
   newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
   newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
   newtio.c_cc[VEOL]     = 0;     /* '\0' */
   newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
   newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
   newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
   newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
   newtio.c_cc[VEOL2]    = 0;     /* '\0' */

  /*
    fCNAC|[g̐ݒLɂ
  */
   tcflush(fd, TCIFLUSH);
   tcsetattr(fd,TCSANOW,&newtio);

  /*
    [̐ݒID͂ł悤ɂȂD
    ł́Cs̐擪 'z' ͂邱ƂŃvOI
  */
   while (STOP==FALSE) {     /* I܂Ń[v */
  /*
      255ȏ͂ꂽꍇłCsI[͂܂ł́Cv
      O̎s read ŃubNDǂݍ񂾕Cۂɓ
      ͂Ă镶菭Ȃꍇɂ́C read Ŏc̕
      ݍ܂Dϐ res ɂ͎ۂɓǂݍ܂ꂽZbgD
  */
      res = read(fd,buf,255);
      buf[res]=0;             /* printf Ŏg߁C̏I[Zbg */
      printf(":%s:%d\n", buf, res);
      if (buf[0]=='z') STOP=TRUE;
   }
   /* |[g̐ݒvOJn̂̂ɖ߂ */
   tcsetattr(fd,TCSANOW,&oldtio);
  }

  3.2.  JmjJ͏

  JmjJ͏[hł́C͂sƂĂ܂Ƃ߂邱Ƃ͍sꂸC
  ͏(erase, kill, delete )s܂D̃[h̐2
  ̃p[^ōs܂D c_cc[VTIME]ŃLN^^C}̐ݒsC
  c_cc[VMIN]ł͓ǂݍ݂𖞑OɎ󂯎ŏ̕ݒ肵܂D

  MIN > 0  TIME = 0 ̏ꍇCMIN œǂݍ݂OɎ󂯎镶
  ݒ肵܂DTIME ̓[Ȃ̂ŁC^C}͎g܂D

  MIN = 0  TIME > 0 ̏ꍇɂ́CTIME ̓^CAEglɂȂ܂Dǂ
  ݂1ǂݍ܂ꂽꍇC TIME (҂ = TIME * 0.1 b) 
  ߂ꍇɖ܂DԂzꍇɂ́C͕Ԃ܂D
  MIN > 0  TIME > 0 ̏ꍇɂ́CTIME ̓LN^ԃ^C}̐ݒɂȂ
  ܂Dǂݍ݂ MIN 󂯎ꍇC2̕󂯎Ԃ̎
   TIME zꍇɖ܂D^C}1󂯎邲Ƃɏ
  ܂D܂Cŏ1󂯎܂ł̓^C}͗Lɂ͂Ȃ܂
  D

  MIN = 0  TIME = 0 ̏ꍇɂ́Cǂݍ݂͑ɖ܂Dݓ
  ݍ݉\ȕCv߂܂DAntonio ɂ
  (contributions Q)Cǂݍ݂̑O fcntl(fd, F_SETFL,FNDELAY); 
  s邱ƂŁCʂ𓾂邱Ƃł܂D

  newtio.c_cc[VTIME]  newtio.c_cc[VMIN] ύX邱ƂŁCȏ̃[h
  SĎƂł܂D

  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <termios.h>
  #include <stdio.h>

  #define BAUDRATE B38400
  #define MODEMDEVICE "/dev/ttyS1"
  #define _POSIX_SOURCE 1 /* POSIX ̃\[X */
  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    char buf[255];

   fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
   if (fd <0) {perror(MODEMDEVICE); exit(-1); }

   tcgetattr(fd,&oldtio); /* ݂̃|[gݒҔ */

   bzero(&newtio, sizeof(newtio));
   newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
   newtio.c_iflag = IGNPAR;
   newtio.c_oflag = 0;

   /* set input mode (non-canonical, no echo,...) */
   newtio.c_lflag = 0;

   newtio.c_cc[VTIME]    = 0;   /* LN^ԃ^C}͖gp */
   newtio.c_cc[VMIN]     = 5;   /* 5󂯎܂ŃubN */

   tcflush(fd, TCIFLUSH);
   tcsetattr(fd,TCSANOW,&newtio);

   while (STOP==FALSE) {       /* ̓[v */
     res = read(fd,buf,255);   /* 5 ͂ꂽ߂ */
     buf[res]=0;               /* printf g߂ɕI[Zbg */
     printf(":%s:%d\n", buf, res);
     if (buf[0]=='z') STOP=TRUE;
   }
   tcsetattr(fd,TCSANOW,&oldtio);
  }

  3.3.  񓯊

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

  #define BAUDRATE B38400
  #define MODEMDEVICE "/dev/ttyS1"
  #define _POSIX_SOURCE 1 /* POSIX ̃\[X */
  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  void signal_handler_IO (int status);   /* VOinh̐錾 */
  int wait_flag=TRUE;                    /* VOi󂯎ĂȂ TRUE */

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    struct sigaction saio;           /* VOi󂯂̓` */
    char buf[255];

    /* foCXubLO[hŃI[v
       (read ͑ɖ߂Ă悤ɂȂ) */
    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd <0) {perror(MODEMDEVICE); exit(-1); }

    /* foCX񓯊[hɂOɁCVOinhݒ肷 */
    saio.sa_handler = signal_handler_IO;
    saio.sa_mask = 0;
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO,&saio,NULL);

    /* vZX SIGIO 󂯎悤ɂ */
    fcntl(fd, F_SETOWN, getpid());
    /* t@CfXNv^񓯊[hɂ (IC}jA
       ΁CO_APPEND  O_NONBLOCK  F_SETFL œ삷Ƃ̂Ɓc
     */
    fcntl(fd, F_SETFL, FASYNC);

    tcgetattr(fd,&oldtio); /* save current port settings */
    /* V|[g̐ݒJmjJ͏ɐݒ肷 */
    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR | ICRNL;
    newtio.c_oflag = 0;
    newtio.c_lflag = ICANON;
    newtio.c_cc[VMIN]=1;
    newtio.c_cc[VTIME]=0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);

    /* ͑҂̊ԃ[v܂Dʏ͂ŉ炩̍Ƃ */
    while (STOP==FALSE) {
      printf(".\n");usleep(100000);
      /* SIGIO 󂯎Cwait_flag = FALSE ɂȂĂΓ͂p
         \Ȃ̂œǂݍ݂sƂł */
      if (wait_flag==FALSE) {
        res = read(fd,buf,255);
        buf[res]=0;
        printf(":%s:%d\n", buf, res);
        if (res==1) STOP=TRUE; /* CR ͂ꂽꍇɃ[vI */
        wait_flag = TRUE;      /* ̓͂҂ */
      }
    }
    /* vOJñ|[gݒ𕜌 */
    tcsetattr(fd,TCSANOW,&oldtio);
  }

  /**********************************************************************
  * VOinhDL̃[vŕ󂯎Ƃ߂ɁC  *
  * wait_flag  FALSE ZbgD                                   *
  ***********************************************************************/

  void signal_handler_IO (int status)
  {
    printf("received SIGIO signal.\n");
    wait_flag = FALSE;
  }

  3.4.  ̓͂̓͑҂

  ̏͂͊ȒPɍς܂܂DqgƂړIȂ̂ŁCTṽv
  OẐɂĂ܂D̎dg̓VA|[głȂCS
  ̃t@CfXNv^̏Wɑ΂ĎgƂł܂D

  select VXeR[Ƃɔ}Nł́Cfd_set g܂D
  ́CSĂ̗Lȃt@CfXNv^̃Gg[܂܂rbg
  Dselect ̓t@CfXNv^ɑΉrbgW fd_set
  Cfd_setɓo͂\ȃt@CfXNv^C邢͗O
  t@CfXNv^̏WZbg܂Dfd_set ̑͗pӂĂ
  }Nōs܂Dڂ̓IC}jA select(2) QƂ
  ĂD

  #include <sys/time.h>
  #include <sys/types.h>
  #include <unistd.h>

  main()
  {
     int    fd1, fd2;  /* ̓\[X 1, 2 */
     fd_set readfs;    /* t@CfXNv^̏W */
     int    maxfd;     /* gĂt@CfXNv^̍ől */
     int    loop=1;    /* [vĂԂ TRUE */

     /* open_input_source ł̓foCX̃I[vC|[g̐ݒ肪s
        Ct@CfXNv^߂lɂȂĂ̂ƂD */
     fd1 = open_input_source("/dev/ttyS1");   /* COM2 */
     if (fd1 <0) exit(0);
     fd2 = open_input_source("/dev/ttyS2");   /* COM3 */
     if (fd2 <0) exit(0);
     maxfd = MAX (fd1, fd2)+1;  /* ׂrbg̍ől */

     /* ͂̂߂̃[v */
     while (loop) {
       FD_SET(fd1, &readfs);  /* \[X 1 𒲂ׂ邱Ƃw */
       FD_SET(fd2, &readfs);  /* \[X 2 𒲂ׂ邱Ƃw */
       /* block until input becomes available */
       select(maxfd, &readfs, NULL, NULL, NULL);
       if (FD_ISSET(fd1))         /* \[X 1 ̓͂\ */
         handle_input_from_source1();
       if (FD_ISSET(fd2))         /* \[X 2 ̓͂\ */
         handle_input_from_source2();
     }

  }

  ̗ł́Cǂ炩̃\[X͂s܂ŁCvO
  łubNĂ܂܂D͂̃^CAEgw肵ꍇɂ́C
  select VXeR[̂̕悤ɏ܂D

       int res;
       struct timeval Timeout;

       /* ̓[vł̃^CAEglݒ */
       Timeout.tv_usec = 0;  /* ~b */
       Timeout.tv_sec  = 1;  /* b */
       res = select(maxfd, &readfs, NULL, NULL, &Timeout);
       if (res==0)
       /* ͂t@CfXNv^̐ 0 Ȃ΁C^CAEg */

  ̗ł 1 bɃ^CAEgɂȂ܂D^CAEgƂȂꍇ
  ́Cselect  0 Ԃ܂CTimeout  selectۂɓ͂҂
  Ԃ̕炳邱ƂɒӂĂD^CAEgl[̏ꍇ
  ɂ́Cselect ͑ɋAĂ܂D

  4.  ̏

  o  Linux Serial-HOWTO ɂ̓VA|[g̐ݒ@ƁCn[hEFȀ
     񂪏Ă܂D

  o  Serial Programming Guide for POSIX Compliant Operating Systems
     <http://www.easysw.com/~mike/serial>DMichael Sweet ̃y[W
     D̃N͂ǂȂȂĂ܂̂łCV URL 킩
     ܂DǂȂĂDǂł̂ɁI

  o  IC}jAtermios(3)ɂ́Ctermios \̂̑SẴtO
     ̐܂D

  5.  Rgr[V

  ŏɏqׂ悤ɁCM҂͂̃̕GLXp[gł͂܂D
  CgŖɒʂC̐l̏؂Ȃ܂
  D European Transonic Windtunnel, Cologne  Strudthoff C Michael
  Carter  (mcarter@rocke.electro.swri.eduCPeter Waltenberg 
  (p.waltenberg@karaka.chch.cri.nz)̊FlɊӂ܂D

  Antonino Ianella (antonino@usa.net́CM҂̕Ă
  Ƃقړ Serial-Port-Programming Mini HOWTO 쐬܂DGreg
  Hankins ̒ĂɂCAntonino  Mini-HOWTO {Ɠ܂
  D

  ̍̕\ SGML ɂ鐮`́CGreg Hankins  Serial-HOWTO 
  ɂĂ܂D{ɏCĂꂽ Dave Pfaltzgraff
  (Dave_Pfaltzgraff@patapsco.com)C Sean Lincolne
  (slincol@tpgi.com.au)C Michael Wiedmann  (mw@miwie.in-
  berlin.de)C Adrey Bonar (andy@tipas.lt) ̊FɊӂ܂D

