  27 September 1997 The Linux Serial Programming HOWTO
  by Peter H. Baumann, Peter.Baumann@dlr.de 
  ƣ, fujiwara@cim.pe.u-tokyo.ac.jp 
  v0.3, 14 June 1997

  ʸǤϡꥢݡȤȤä̿ץν
  
  ______________________________________________________________________

  Table of Contents:

  1.      Ϥ

  1.1.    ˤĤ

  1.2.    ʸκǿǤˡ

  1.3.    եɥХå

  2.      ϤƤߤ褦

  2.1.    ǥХåˡ

  2.2.    ݡȤ

  2.3.    ꥢǥХˤϤγǰ

  2.3.1.  Υ˥Ͻ

  2.3.2.  󥫥Υ˥Ͻ

  2.3.3.  Ʊ

  2.3.4.  ʣϤԤ

  3.      ץ

  3.1.    Υ˥Ͻ

  3.2.    󥫥Υ˥Ͻ

  3.3.    Ʊ

  3.4.    ʣϤԤ

  4.      ¾ξ󥽡

  5.      ȥӥ塼
  ______________________________________________________________________

  1.  Ϥ

  ʸ Linux Serial Programming HOWTO ǤLinux ΥꥢݡȤ
  Ȥäơ¾ΥǥХ/ԥ塼̿ץν⤷
  ޤΥ˥ I/O(ñ̤Ǥ)Ʊ I/Oʣ
  ԤΡۤʤ륿פμˡ⤷ޤ

  ʸǤϡꥢݡȤˡޤ󡣤ˤĤƤϡ
  Greg Hankins ν񤫤줿 Serial-HOWTO 

  ϥꥢ̿ʬȤǤϤޤ󤬡ꥢ̿˴ؤ
  Ȥ褷ƤޤʸǾҲ𤹤륵ץ륳ɤϡ
  LDP ץޡ
  (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz ڤӥߥ顼) 'examples' ǥ쥯ȥ꤫
  ꤹ뤳ȤǤ miniterm ͳ褹ΤǤʸȿǤޤ
  ǡȤäƤ(եɥХåξϤ򻲾)

  ƤΥƥȤϡi386 ١ Linux 2.0.29 ǹԤޤ

  1.1.  ˤĤ

  Linux Serial-Programming-HOWTOPeter Baumann ʪǤ(copyright
  (C) 1997)Linux HOWTO ʸϡɽѤʤ¤ꡢʸ
  뤤ΤǤդŻŪʪŪǥʣڤۤ뤳
  ǤޤŪۤǧƤꡢޤޤƤޤ
  Τ褦ۤξˤϡԤؤϢ뤳Ȥ˾ޤ

  ʪLinux HOWTO ʸޤԽʪϤɽ˽ʤ
  Фʤޤ󡣤ĤޤꡢHOWTO ʪꡢ¤ɲ
  ۤ뤳ȤϤǤޤ󡣤ξβǤε§㳰
  ǧ뤳ȤǤ礬ޤʲ˥ɥ쥹򼨤 Linux HOWTO 
  ̤Ƥ

  ñ˸С桹ϤξǤ¿ηϩǹ᤿ȻפäƤ
  ޤHOWTO ʸݻ뤳ȤȡHOWTO ۤ
  ƤˡǤΤ餻Ƥ館뤳Ȥ˾Ƥޤ

  СLinux HOWTO Ǥ gregh@sunsite.unc.edu 
  Żҥ᡼̤Ƥ

  1.2.  ʸκǿǤˡ

  Serial-Programming-HOWTO κǿǤ
  ftp://sunsite.unc.edu:/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO
  ڤӡΥߥ顼ȤǤޤPostScript  DVI ηʸ
  other-formatsǥ쥯ȥˤޤޤ
  http://sunsite.unc.edu/LDP/HOWTO/Serial-Programming-HOWTO.html ˤ⤢
  ޤ˰comp.os.linux.answers˥塼롼פˤƤ
  

  1.3.  եɥХå

  䡢ȡơɲûʤɤСɮԤˤΤ餻
  ʸɤΤˤȻפäƤޤ褯ʬʤ
  䡢äʬ䤹ǤʬΤ餻ƤɮԤϢ
  ˤPeter.Baumann@dlr.deŻҥ᡼ФƤŻҥ᡼
  ݤˤϡɤ Serial-Programming-HOWTO ΥС(ʸϥС
  0.3Ǥ)񤤤Ƥ

  : ܸκǿǤJF ץȥۡڡ Ǥޤ
  Ԥإ᡼ФƤ

  2.  ϤƤߤ褦

  2.1.  ǥХåˡ

  ʤ񤤤ɤǥХå뤿κǤɤˡϡLinux ޥ
  ⤦ѰդΥԥ塼̥ǥॱ֥³뤳Ȥ
  miniterm(LDP ץޡ
  (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz 'examples'ǥ쥯ȥˤޤ)Ȥäơ
   Linux ޥʸäƤߤޤ礦miniterm ˴ñ˥
  ѥǤܡϤ򥷥ꥢݡȷͳǤΤޤ(raw)
  define ʸ #define MODEMDEVICE "/dev/ttyS0"ʬϥ
  ʤƤϤʤޤ󡣤ʬϡ֥³Τ COM1 Ǥ
   ttyS0COM2ǤttyS1Τ褦ꤷޤΥƥȤ
  ϡƤʸϤΤޤ(raw, Ͻ̵)뤳ȤǤ³
  ƥȤ򤹤ȤϡξΥޥ miniterm ¹Ԥܡɤá
  ǤΥޥϤ줿ʸϡ⤦ΥޥǽϤ
  εդƱǤϤʸϡϤΥޥβ̤ˤϥ
  ޤ

  ̥ǥॱ֥򼫺ˤϡTxD()RxD()η򥯥
  ޤ֥ˤĤƤξܤϡSerial-HOWTO 7Ϥˤ
  

  ̤ѤΥꥢݡȤ2ĤΤʤСΥԥ塼ǤΥƥ
  Ȥ¹Ԥ뤳ȤǤޤξϡ2Ĥβۥ󥽡Ǥ줾
  miniterm ¹Ԥޤꥢޥ򳰤ƥꥢݡȤ
  ˤϡ/dev/mouse񴹤뤳Ȥ˺ʤ褦ˤޤ礦ޥݡ
  ȥꥢ륫ɤȤäƤˤϡ꤬Ȥǧޤ
  ɮԤϼʬΥޥǴְä򤷤ƤˡʬΥޥǥ
  ȤޤưȤ֤ˤʤäȤޤ
  ¾Υԥ塼³ˤϡʸäƤޤޤ 2ĤΥ
  1ĤΥԥ塼ưȤϡƱȤϸޤ
  

  2.2.  ݡȤ

  /dev/ttyS*ȤǥХü Linux ޥ˷ҤΤΤǡ̿
  Ϥ᤿ü˹碌꤬Ԥޤ raw ǥХ
  Ȥä̿ץԤˤϡդƤʤФʤޤ
  㤨Сä饯򥨥Хå褦˥ꥢݡȤ
  Ƥޤ̾ǡΤˤϤѹʤФ
  

  ƤΥѥ᡼ϥץǴñǤޤϥإåե
  <asm/termbits.h>Ƥ termios ¤Τ¸ޤ

        #define NCCS 19
        struct termios {
                tcflag_t c_iflag;               /* ϥ⡼ɥե饰 */
                tcflag_t c_oflag;               /* ϥ⡼ɥե饰 */
                tcflag_t c_cflag;               /* ⡼ɥե饰 */
                tcflag_t c_lflag;               /* ⡼ɥե饰 */
                cc_t c_line;                    /* 饤ǥץ(line discipline) */
                cc_t c_cc[NCCS];                /* ʸ */
        };

  <asm/termbits.h> եˤϡե饰ƵҤƤ
  c_iflag ե饰ˤϥ⡼ɤΥե饰ĤޤޤƤꡢƤ
  ϽꤷޤϽȤϡǥХ줿饯
  ϡreadɤ߽Ф˽뤳ȤǤȤȤǤƱ
  ˡc_oflagϽϽ򰷤ޤ c_cflagϡܡ졼ȤʸΥӥ
  ȿȥåץӥåȤʤɤΥݡϿƤޤc_lflag Υ
  ⡼ɥե饰ϡʸ뤫ɤץ˥ʥ뤬
  뤫ɤꤷޤǸˡ c_cc Ǥϡե뽪
  üstop ʸޤʸΥǥեͤ
  <asm/termios.h> Ƥޤƥե饰ˤĤƤϡ饤
  ˥奢 termios(3) ޤ

  termios ˤ c_line ȤФޤΥФˤĤ
  ϡLinux  termios Υޥ˥奢ˤ⡢Solaris 2.5 Υޥ˥奢ˤ
  ޤ󡣤¸äС󤴶
  c_line Ф termio ¤Τ˴ޤޤƤΤʤΤǤϤʤΤ
  礦?

  2.3.  ꥢǥХˤϤγǰ

  Ǥϡ3ĤΰۤʤϤγǰޤŪ˽äơ
  Ŭڤʳǰ򤷤ƤʸΤΤˡ1ʸɤ߹
  Υ롼פȤȤϤǤ¤򤱤٤ǤϤäȤ
  ߹߻ read 顼ϤʤäΤˤ⤫餺ʸ
  ƤޤäȤޤ

  2.3.1.  Υ˥Ͻ

  üФƤ̾ν⡼ɤǤ¾ΥǥХȤ̿λ
  ǤƤϤϹñ̤ǽޤĤޤꡢread Ϥ1
  ΤΤߤ֤ƤޤǥեȤǤϡԤNL(ASCII LF)ե뽪
  üԽüʸΤ줫ǽޤɸǤϡCR (DOS/Windows 
  ǥեȤιԽüʸ)ϹԤνüȤϤʤޤ

  Υ˥ϽǤϡõ(erase)ñκ(delete word)ʸκ
  (reprint characters)CRNLؤѴʤɤ򰷤ȤǤޤ

  2.3.2.  󥫥Υ˥Ͻ

  󥫥Υ˥Ͻϡread ˷ޤäʸ򰷤ˡǡ
  ޤѤ뤳ȤǤޤΥ⡼ɤϥץꥱ󤬷
  ޤäʸΥ饯ɤ߹䡢³ǥХ̤ʸ
  äƤ˻Ѥޤ

  2.3.3.  Ʊ

  嵭2ĤΥ⡼ɤϡƱڤƱ⡼ɤǻȤȤǤޤǥե
  ȤϡϤޤޤ read ʸ֥åƱ⡼ɤǤƱ
  ⡼ɤǤϡread ʸ¨¤˽λɤ߹ߤλ˥ץ
  ˥ʥ뤬ޤΥʥϡʥϥɥȤäƼ
  ޤ

  2.3.4.  ʣϤԤ

  ̤ϥ⡼ɤȤ櫓ǤϤޤ󤬡ʣΥǥХ򰷤
  ǤɮԤΥץꥱǤϡTCP/IP åȷͳϤ¾
  Υԥ塼Υꥢ³ͳϤ򵼻ŪƱ˰äƤ
  ʲ˼ץǤϡۤʤ2ĤϥԤ
  ԤޤΥϤǽˤʤȡϤ졢
  ϼϤԤޤ

  ʲ˼ץϤäʣ˸ޤLinux ϥޥץ
   OS Ǥ뤳Ȥ˺ƤϤޤselectƥॳ
  δ֤ CPU ٤Ϳޤ󤬡롼פȤäԤԤȡƱ
  ˼¹ԤƤ¾Υץ٤ʤäƤޤޤ

  3.  ץ

  Ƥ miniterm.c ФΤǤϤΥХåե 255
  ʸ¤ƤޤϡΥ˥ϽκʸĹƱ
   (<linux/limits.h> 뤤 <posix1_lim.h>򻲾)

  줾ϥ⡼ɤλȤˤĤƤϥץΥȤ򸫤Ƥ
  ץϽʬɤߤʤȻפޤΥ˥ϥ⡼ɤ
  ϰ־ܤȤդƤޤ㤤Ĵ뤿ˡ¾ˤĤ
  ƤϥΥ˥ϥ⡼ɤȤ񤤤Ƥޤ

  ϴǤϤޤ󤬡ͦФǼ¸ʤŪ˺
  Ŭ򸫤ĤƤ

  Ѥ륷ꥢݡȤˤϡŬڤʥѡߥåͿΤ˺ʤ
  (: chmod a+rw /dev/ttyS1)

  3.1.  Υ˥Ͻ

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

        /* <asm/termbits.h> Ƥܡ졼Ȥꡣ
        <termios.h>饤󥯥롼ɤ롣 */
        #define BAUDRATE B38400
        /* ŬڤʥꥢݡȤؤ褦ˡѹ롣*/
        #define MODEMDEVICE "/dev/ttyS1"
        #define _POSIX_SOURCE 1 /* POSIX Υ */

        #define FALSE 0
        #define TRUE 1

        volatile int STOP=FALSE;

        main()
        {
          int fd,c, res;
          struct termios oldtio,newtio;
          char buf[255];
        /*
          ɤ߽񤭤Τ˥ǥǥХ򥪡ץ󤹤롣Υˤä CTRL-C
          ޤȯƤ³ڤʤ褦ˡtty Ϥʤ
        */

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

         tcgetattr(fd,&oldtio); /* ߤΥꥢݡȤ򤵤*/
         bzero(newtio, sizeof(newtio)); /* ݡȤι¤Τ򥯥ꥢ */

        /*
          BAUDRATE: ܡ졼Ȥꡣcfsetispeed  cfsetospeed ѤǤ롣
          CRTSCTS : ϤΥϡɥե (ɬפʷƤƤ륱
                    ֥ȤΤߡSerial-HOWTO 7Ϥ򻲾ȤΤ)
          CS8     : 8n1 (8 ӥåȡΥѥƥȥåץӥå 1)
          CLOCAL  : ³ǥʤ
          CREAD   : ʸ(receiving characters)ͭˤ롣
        */
         newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

        /*
          IGNPAR  : ѥƥ顼Υǡ̵뤹
          ICRNL   : CR  NL б(Ԥʤȡ¾Υԥ塼
                    CR ϤƤ⡢Ϥˤʤʤ)
          ʳǤϡǥХ raw Ǥ(¾ϽϹԤʤ)
        */
         newtio.c_iflag = IGNPAR | ICRNL;

        /*
         Raw 
        */
         newtio.c_oflag = 0;

        /*
          ICANON  : Υ˥Ϥͭˤ
          ƤΥ̵ˤץФƥʥ餻ʤ
        */
         newtio.c_lflag = ICANON;

        /*
          Ƥʸ
          ǥեͤ /usr/include/termios.h 򸫤ʬ뤬Ȥ˽
          ƤΤǡǤϸɬפϤʤ
        */
         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;     /* 饯֥ޤȤʤ */
         newtio.c_cc[VMIN]     = 1;     /* 1ʸޤǡɤ߹ߤ֥å */
         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' */

        /*
          ǥ饤򥯥ꥢݡȤͭˤ
        */
         tcflush(fd, TCIFLUSH);
         tcsetattr(fd,TCSANOW,&newtio);

        /*
          ü꽪λϤǤ褦ˤʤä
          ǤϡԤƬ 'z' Ϥ뤳Ȥǥץλ
        */
         while (STOP==FALSE) {     /* λ郎ޤǥ롼 */
        /*
            255ʸʾϤ줿Ǥ⡢ԽüʸϤޤǤϡץ
            μ¹Ԥ read ǥ֥å롣ɤ߹ʸºݤ
            ϤƤʸ꾯ʤˤϡ read ǻĤʸ
            ߹ޤ롣ѿ res ˤϼºݤɤ߹ޤ줿ʸåȤ롣
        */
            res = read(fd,buf,255);
            buf[res]=0;             /* printf ǻȤᡢʸνü򥻥åȤ */
            printf(":%s:%d\n", buf, res);
            if (buf[0]=='z') STOP=TRUE;
         }
         /* ݡȤץ೫ϻΤΤ᤹ */
         tcsetattr(fd,TCSANOW,&oldtio);
        }

  3.2.  󥫥Υ˥Ͻ

  󥫥Υ˥Ͻ⡼ɤǤϡϤԤȤƤޤȤ뤳ȤϹԤ줺
  Ͻ(erase, kill, delete )Ԥޤ󡣤Υ⡼ɤ2
  Υѥ᡼ǹԤޤ c_cc[VTIME]ǥ饯ޤԤ
  c_cc[VMIN]Ǥɤ߹ߤ­˼Ǿʸꤷޤ

  MIN > 0  TIME = 0 ξ硢MIN ɤ߹ߤ­˼ʸ
  ꤷޤTIME ϥʤΤǡޤϻȤޤ

  MIN = 0  TIME > 0 ξˤϡTIME ϥॢͤˤʤޤɤ
  ߤ1ʸɤ߹ޤ줿礫 TIME (Ԥ = TIME * 0.1 ) 
  ᤮­ޤ֤ۤˤϡʸ֤ޤ

  MIN > 0  TIME > 0 ξˤϡTIME ϥ饯֥ޤˤʤ
  ޤɤ߹ߤ MIN ʸä礫2Ĥʸ֤λ
   TIME ۤ­ޤޤ1ʸ뤴Ȥ˽
  ޤޤǽ1ʸޤǤϥޤͭˤϤʤޤ
  

  MIN = 0  TIME = 0 ξˤϡɤ߹ߤ¨¤­ޤ
  ߹߲ǽʸ׵ᤷʸᤵޤAntonio ˤ
  (contributions )ɤ߹ߤ fcntl(fd, F_SETFL,FNDELAY); 
  Ԥ뤳ȤǡƱ̤뤳ȤǤޤ

  newtio.c_cc[VTIME]  newtio.c_cc[VMIN] ѹ뤳ȤǡʾΥ⡼
  ƻȤǤޤ

        #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 Υ */
        #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); /* ߤΥݡ */

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

         /* ϥ⡼ɤ (󥫥Υ˥롢̵) */
         newtio.c_lflag = 0;

         newtio.c_cc[VTIME]    = 0;   /* 饯֥ޤ̤ */
         newtio.c_cc[VMIN]     = 5;   /* 5ʸޤǥ֥åޤ */

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

         while (STOP==FALSE) {       /* ϥ롼 */
           res = read(fd,buf,255);   /* 5 ʸϤ줿ޤ */
           buf[res]=0;               /* printf ȤǤ */
           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 Υ */

        #define FALSE 0
        #define TRUE 1

        volatile int STOP=FALSE;

        void signal_handler_IO (int status);   /* ʥϥɥ */
        int wait_flag=TRUE;                    /* ʥäƤʤ TRUE */

        main()
        {
          int fd,c, res;
          struct termios oldtio,newtio;
          struct sigaction saio;           /* ʥư */
          char buf[255];

          /* ǥХ֥å󥰥⡼ɤǥץ󤹤
             (read ¨¤äƤ褦ˤʤ) */
          fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
          if (fd <0) {perror(MODEMDEVICE); exit(-1); }

          /* ǥХƱ⡼ɤˤˡʥϥɥꤹ */
          saio.sa_handler = signal_handler_IO;
          saio.sa_mask = 0;
          saio.sa_flags = 0;
          saio.sa_restorer = NULL;
          sigaction(SIGIO,&saio,NULL);

          /* ץ SIGIO 褦ˤ */
          fcntl(fd, F_SETOWN, getpid());
          /* եǥץƱ⡼ɤˤ (饤ޥ˥奢
             СO_APPEND  O_NONBLOCK  F_SETFL ưȤΤȡ
           */
          fcntl(fd, F_SETFL, FASYNC);

          tcgetattr(fd,&oldtio); /* ߤΥݡȤ򤹤 */
          /* ݡȤ򥫥Υ˥Ͻꤹ */
          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);

          /* Ԥδ֥롼פޤ̾Ϥǲ餫κȤ򤹤 */
          while (STOP==FALSE) {
            printf(".\n");usleep(100000);
            /* SIGIO ꡢwait_flag = FALSE ˤʤäƤϤѲ
               ǽʤΤɤ߹ߤԤȤǤ */

            if (wait_flag==FALSE) {
              res = read(fd,buf,255);
              buf[res]=0;
              printf(":%s:%d\n", buf, res);
              if (res==1) STOP=TRUE; /* CR Ϥ줿˥롼׽λ */
              wait_flag = TRUE;      /* ϤԤ */
            }
          }
          /* ץ೫ϻΥݡ */
          tcsetattr(fd,TCSANOW,&oldtio);
        }

        /**********************************************************************
        * ʥϥɥ顣嵭Υ롼פʸäȤ򼨤ˡ  *
        * wait_flag  FALSE 򥻥åȤ롣                                   *
        ***********************************************************************/

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

  3.4.  ʣϤԤ

  ξϤϴñ˺ѤޤޤҥȤ򼨤ȤŪʤΤǡץΥץ
  ûΤˤƤޤλȤϥꥢݡȤǤʤ
  ΥեǥץνФƻȤȤǤޤ

  select ƥॳȤȼޥǤϡfd_set Ȥޤ
  ϡƤͭʥեǥץΥȥ꡼ޤޤӥå
  select ϥեǥץбӥåȽ fd_set
  fd_setϤǽʥեǥץ뤤㳰ȯ
  եǥץν򥻥åȤޤfd_set ѰդƤ
  ޥǹԤޤܤϥ饤ޥ˥奢 select(2) 򻲾Ȥ
  Ƥ

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

        main()
        {
           int    fd1, fd2;  /* ϥ 1, 2 */
           fd_set readfs;    /* եǥץν */
           int    maxfd;     /* ȤƤեǥץκ */
           int    loop=1;    /* 롼פƤ֤ TRUE */

           /* open_input_source ǤϥǥХΥץݡȤ꤬Ԥ
              졢եǥץᤷͤˤʤäƤΤȤ롣 */
           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;  /* Ĵ٤ӥåĹκ */

           /* ϤΤΥ롼 *'/
           while (loop) {
             FD_SET(fd1, &readfs);  /*  1 Ĵ٤뤳Ȥ */
             FD_SET(fd2, &readfs);  /*  1 Ĵ٤뤳Ȥ */
             /* Ϥǽˤʤޤǥ֥åޤ */
             select(maxfd, &readfs, NULL, NULL, NULL);
             if (FD_ISSET(fd1))         /*  1 Ϥǽ */
               handle_input_from_source1();
             if (FD_ISSET(fd2))         /*  2 Ϥǽ */
               handle_input_from_source2();
           }

        }

  Ǥϡɤ餫ΥϤԤޤǡץबĤ
  Ǥ֥åƤޤޤϤΥॢȤꤷˤϡ
  select ƥॳʬ򼡤Τ褦˽񤭴ޤ

        int res;
        struct timeval Timeout;

        /* ϥ롼פǤΥॢͤ */
        Timeout.tv_usec = 0;  /* ߥ */
        Timeout.tv_sec  = 1;  /*  */
        res = select(maxfd, &readfs, NULL, NULL, &Timeout);
        if (res==0)
        /* Ϥäեǥץο 0 ʤСॢȯ */

  This example will timeout after 1 second. If a timeout occurs, select
  will return 0, but beware that Timeout is decremented by the time
  actually waited for input by select. If the timeout value is zero,
  select will return immedeatly.

  Ǥ 1 ø˥ॢȤˤʤޤॢȤȤʤä
  ϡselect  0 ֤ޤTimeout  selectºݤϤԤä
  ֤ʬ餵뤳ȤդƤॢͤξ
  ˤϡselect ¨¤˵äƤޤ

  4.  ¾ξ󥽡

  o  Linux Serial-HOWTO ˤϥꥢݡȤˡȡϡɥξ
     󤬽񤫤Ƥޤ

  o  Serial Programming Guide for POSIX Compliant Operating Systems
     <http://www.easysw.com/~mike/serial/>, Michael Sweet Υڡ
     

  o  饤ޥ˥奢termios(3)ˤϡtermios ¤ΤƤΥե饰
     ޤ

  5.  ȥӥ塼

  ǽ˽Ҥ٤褦ˡɮԤϤʬΥѡȤǤϤޤ󡣤
  ʬȤľ̤¾οͤνڤʤ褷ޤ
   European Transonic Windtunnel, Cologne  Strudthoff ᡢ Michael
  Carter  (mcarter@rocke.electro.swri.eduPeter Waltenberg 
  (p.waltenberg@karaka.chch.cri.nz)γͤ˴դޤ

  Antonino Ianella (antonino@usa.netϡɮԤʸƤ
  ȤۤƱ Serial-Port-Programming Mini HOWTO ޤGreg
  Hankins ƤˤꡢAntonino  Mini-HOWTO ʸ礷ޤ
  

  ʸι¤ SGML ˤϡGreg Hankins  Serial-HOWTO 
  ˤƤޤ

