<!doctype linuxdoc system>
<article>
<title>The Linux Serial Programming HOWTO
<subtitle>¸®´ª½º ½Ã¸®¾ó ÇÁ·Î±×·¡¹Ö ÇÏ¿ìÅõ
<author>Peter H. Baumann, <tt><htmlurl url="mailto:Peter.Baumann@dir.de"
name="Peter.Baumann@dir.de"></tt>

<date>v1.0, 22 January 1998
<trans>Àü¼º¹Î, <tt><htmlurl url="mailto:schun@crypto.pe.kr"
name="schun@crypto.pe.kr"></tt>
<tdate>2000³â 2¿ù 24ÀÏ


<abstract>
ÀÌ ¹®¼­´Â ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ ½Ã¸®¾ó Åë½ÅÀ» ¾î¶»°Ô ÇÁ·Î±×·¡¹ÖÇÏ´Â°¡¸¦
¼³¸íÇÏ´Â ÇÏ¿ìÅõ ¹®¼­ÀÌ´Ù.
</abstract>

<toc>


<sect>¼Ò°³

<p>
ÀÌ ¹®¼­´Â ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ ½Ã¸®¾ó Åë½ÅÀ» ¾î¶»°Ô ÇÁ·Î±×·¡¹ÖÇÏ´Â°¡¸¦
¼³¸íÇÏ´Â ÇÏ¿ìÅõ ¹®¼­ÀÌ´Ù. ´Ù¾çÇÑ ½Ã¸®¾ó Åë½Å ÇÁ·Î±×·¥ ±â¹ýµé(Canonical
I/O, ºñµ¿±â I/O, I/O ¸ÖÆ¼ÇÃ·º½Ì)À» ¼³¸íÇÑ´Ù.

<p>
½Ã¸®¾ó Æ÷Æ®¸¦ ¼Â¾÷ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­´Â Greg HankinsÀÇ
<em>Serial-HOWTO</em> ¹®¼­¸¦ ÀÐ¾îº¸±â ¹Ù¶õ´Ù.

<p>
³ª´Â ÀÌ ºÐ¾ßÀÇ Àü¹®°¡°¡ ¾Æ´ÔÀ» ¸ÕÀú ¹àÇôµÐ´Ù. ±×·¯³ª ÇÁ·ÎÁ§Æ®¸¦ ÇÏ¸é¼­
¸¹Àº ¹®Á¦µé¿¡ ºÎµúÇû´Ù. ÀÌ ¹®¼­¿¡ ¼Ò°³µÈ ÄÚµå ¿¹Á¦µéÀº LDP(Linux Document
Project) ÇÁ·Î±×·¡¸Ó °¡ÀÌµå(<htmlurl url="ftp://sunsite.unc.edu/pub/
Linux/docs/LDP/programmers-guide/lpg-0.4.tar.gz"
name="ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-guide/lpg-0.4.tar.gz">
¹× ¹Ì·¯ »çÀÌÆ®µé)¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Â miniterm code¿¡ ±Ù°ÅÇÏ¿© ¸¸µé¾ú´Ù.

<p>
1997³â 6¿ù¿¡ ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇÑ µÚ¿¡ ³ª´Â °í°´ÀÇ ¿ä±¸¿¡ ÀÇÇØ Win NT È¯°æÀ¸·Î
¿Å±â°Ô µÇ¾î¼­ ´õ ÀÌ»ó ±íÀº Áö½ÄÀ» ¾òÀ» ¼ö ¾ø¾ú´Ù. ´©±¸µçÁö Ä¿¸ÇÆ®°¡
ÀÖÀ¸¸é ÀÌ ¹®¼­¸¦ °ü¸®ÇÏ´Âµ¥¿¡ ±â²¨ÀÌ È°¿ëÇÏ°Ú´Ù.(Feedback ºÎºÐÀ» º¼ °Í)
¶ÇÇÑ ÀÌ ¹®¼­ÀÇ À¯Áö ¹× °ü¸®¸¦ ¸Ã°í ½Í°Å³ª version UPÀ» ¿øÇÑ´Ù¸é e-mailÀ»
ÁÖ±â ¹Ù¶õ´Ù.

<p>
ÀÌ ¹®¼­ÀÇ ¸ðµç ¿¹Á¦´Â i386 Linux Kernel 2.0.29¿¡¼­ Å×½ºÆ®¸¦ ÇÏ¿´´Ù.


<sect1>ÀúÀÛ±Ç

<p>
The Linux Serial-Programming-HOWTO is copyright (C) 1997 by Peter
Baumann. Linux HOWTO documents may be reproduced and distributed in
whole or in part, in any medium physical or electronic, as long as
this copyright notice si retained on all copies. Commercial
redistribution is allowed and encouraged; however, the author would
like to be notified of any such distributions.

<p>
All translations, derivative works, or aggregate works incorporating
any Linux HOWTO documents must be covered under this copyright notice.
That is, you may not produce a derivative work from a HOWTO and impose
additional restrictions on its distribution. Exceptions to thes rules
may be granted under certain conditions; please contact the Linux
HOWTO coordinator at the address given below.

<p>
In short, we wish to promote dissemination of this information through
as many channels as possible. However, we do wish to retain copyright
on the HOWTO documents, and would <em>like</em> to be notified of
any plans to redistribute the HOWTOs.

<p>
If you have questions, please contact Tim Bynum, the Linux HOWTO
coordinator, at <tt><htmlurl url="mailto:linux-howto@sunsite.unc.edu"
name="linux-howto@sunsite.unc.edu"></tt> via email.


<sect1>ÀÌ ¹®¼­ÀÇ ÃÖ½Å ¹öÀü

<p>
ÀÌ ¹®¼­ÀÇ ÃÖ½Å ¹öÀüÀº 
<htmlurl url="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO"
name="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO">
¿Í ¹Ì·¯ »çÀÌÆ®¿¡¼­ Ã£À» ¼ö ÀÖ´Ù. PostScript ¹×
DVI ¹öÀüµµ ´Ù¸¥ Æ÷¸ËµéÀ» °®°í ÀÖ´Â µð·ºÅä¸®¿¡ ÀÖ´Ù.
<htmlurl url="http://sunsite.unc.edu/LDP/HOWTO/Serial-Programming-HOWTO.html"
name=" http://sunsite.unc.edu/LDP/HOWTO/Serial-Programming-HOWTO.html">
¿¡¼­µµ ±¸ÇÒ ¼ö ÀÖÀ¸¸ç,
<htmlurl url="news:comp.os.linux.answers"
name="comp.os.linux.answers">¿¡ ¸Å´Þ Æ÷½ºÆÃ µÉ °ÍÀÌ´Ù.


<sect1>Feedback

<p>
¿À·ù, Áú¹®, Ä¿¸ÇÆ®, °ÇÀÇ»çÇ×ÀÌ³ª ±× ¿Ü Ãß°¡ÇÒ »çÇ×ÀÌ ÀÖ´Ù¸é ¾Ë·ÁÁÖ±â
¹Ù¶õ´Ù. ÀÌ HOWTO¸¦ °è¼ÓÀûÀ¸·Î ¾÷µ¥ÀÌÆ® ÇÏ±â¸¦ ¿øÇÑ´Ù. ´ç½ÅÀÌ Á¤È®È÷
ÀÌÇØÇÏÁö ¸øÇÏ´Â ºÎºÐÀÌ ÀÖ°Å³ª ´õ ¸íÈ®ÇØ¾ß ÇÒ ºÎºÐÀÌ ÀÖ´Ù¸é ¾Ë·ÁÁà¶ó.
³» e-mail ÁÖ¼Ò´Â <tt><htmlurl url="mailto:Peter.Baumann@dir.de"
name="Peter.Baumann@dir.de"></tt> ÀÌ´Ù. ÀÌ ¹®¼­¿¡ °üÇÑ e-mailÀ»
º¸³¾ ¶§´Â ¹®¼­ÀÇ ¹öÀüµµ °°ÀÌ ¾Ë·ÁÁà¶ó. ÀÌ ¹®¼­ ¹öÀüÀº 1.0ÀÌ´Ù.



<sect>½ÃÀÛÇÏ±â


<sect1>µð¹ö±ë

<p>
ÄÚµå¸¦ µð¹ö±ëÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº ¶Ç ÇÏ³ªÀÇ ¸®´ª½º ¹Ú½º¸¦ ¼Â¾÷ÇÏ°í
µÎ ¸®´ª½º ¹Ú½º¸¦ null-modem ÄÉÀÌºí·Î ¿¬°áÇÏ´Â °ÍÀÌ´Ù. Miniterm ÇÁ·Î±×·¥À»
ÀÌ¿ëÇÏ¿© ¹®ÀÚµéÀ» Àü¼ÛÇØº¸¶ó. MinitermÀº ÄÄÆÄÀÏÇÏ±âµµ ½±°í, Å°º¸µå¿¡¼­
ÀÔ·ÂµÇ´Â ¹®ÀÚµé(Æ¯¼ö¹®ÀÚ Æ÷ÇÔ)À» ½Ã¸®¾ó Æ÷Æ®·Î Àü¼ÛÇÒ ¼ö ÀÖ´Ù. ÄÄÆÄÀÏÇÒ ¶§
Ã¼Å©ÇØ¾ß ÇÒ °ÍÀº

<tt>#define MODEMDEVICE "/dev/ttyS0"</tt>

¹®ÀåÀÌ Á¦´ë·Î ¼³Á¤µÇ¾î ÀÖ´Â°¡ ÇÏ´Â °ÍÀÌ´Ù. COM1À¸·Î ¸ÂÃß·Á¸é
<tt>/dev/ttyS0</tt>, COM2·Î ÇÏ·Á¸é <tt>/dev/ttyS1</tt>À¸·Î ¼öÁ¤ÇÑ´Ù.
Å×½ºÆÃÀ» ÇÒ ¶§ °¡Àå Áß¿äÇÑ °ÍÀº ¹®ÀÚ°¡ ½Ã¸®¾ó Æ÷Æ®·Î Ãâ·ÂµÉ ¶§
µ¥ÀÌÅÍ°¡ Ãâ·Â µ¥ÀÌÅÍ Ã³¸®(output processing)À» ÇÏÁö ¾Ê°í
±×´ë·Î(raw) Àü¼ÛÀÌ µÇ´Â°¡¸¦ È®ÀÎÇÏ´Â °ÍÀÌ´Ù. Å×½ºÆ® °úÁ¤Àº ´ÙÀ½°ú
°°´Ù. µÎ ´ëÀÇ ¸®´ª½º ¹Ú½º¿¡¼­ °¢°¢ miniterm ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°°í Å°º¸µå¸¦
ÃÄº»´Ù. ÇÑ °÷¿¡¼­ Å¸ÀÌÇÎÇÑ ¹®ÀÚ°¡ ´Ù¸¥ °÷¿¡¼­ ±×´ë·Î ³ªÅ¸³ª´Â Áö È®ÀÎÇÑ´Ù.

<p>
Null-modem ÄÉÀÌºíÀÇ TxD¿Í RxD°¡ ¼­·Î cross ¿¬°áÀÌ µÇ¾î¾ß ÇÑ´Ù. Àß ¸ð¸£°ÚÀ¸¸é
<em>Serial-HOWTO</em> ¹®¼­ÀÇ 7ÀåÀ» º»´Ù.

<p>
À§ÀÇ Å×½ºÆ®´Â ÇÑ ´ëÀÇ ÄÄÇ»ÅÍ¸¸ °®°íµµ °¡´ÉÇÏ´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â ½Ã¸®¾ó Æ÷Æ®°¡
µÎ °³ ÀÖ´Ù¸é ÄÉÀÌºíÀ» °¢°¢ÀÇ ½Ã¸®¾ó Æ÷Æ®¿¡ ¿¬°áÇÏ°í minitermÀ» µÎ °³ ½ÇÇàÇÏ¿©
Å×½ºÆ®ÇÏ¸é µÈ´Ù.


<sect1>Æ÷Æ® ¼¼ÆÃ

<p>
ÀåÄ¡ ÆÄÀÏÀÎ <tt>/dev/ttyS*</tt>´Â ¸®´ª½º¿¡¼­ ÅÍ¹Ì³ÎÀ» ¿¬°áÇÏ±â À§ÇÑ
¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ÀÌ »ç½ÇÀº ½Ã¸®¾ó Åë½Å ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Âµ¥
¹Ýµå½Ã ±â¾ïÇØ¾ß ÇÒ »çÇ×ÀÌ´Ù. ¿¹¸¦ µé¾î, ½Ã¸®¾ó Æ÷Æ®µµ ¹®ÀÚ ¿¡ÄÚ¸¦
ÇÏµµ·Ï ¼³Á¤µÇ¾î ÀÖ´Ù. ÀÌ ¼³Á¤Àº º¸Åë µ¥ÀÌÅÍ Àü¼Û½Ã¿¡ ¹Ù²ã¾ß ÇÒ »çÇ×ÀÌ´Ù.
(¿ªÀÚ ÁÖ: ½Ã¸®¾ó ÀåÄ¡ ÆÄÀÏµµ ÅÍ¹Ì³Î ÀåÄ¡·Î ºÐ·ùµÇ±â ¶§¹®¿¡ ÃÊ±â ¼³Á¤Àº
ÀÏ¹Ý ÅÍ¹Ì³Î¿¡¼­ »ç¿ëµÇ´Â ¿¡ÄÚ°¡ µÇµµ·Ï ¼³Á¤µÇ¾î ÀÖ´Â °ÍÀÌ´Ù.)

<p>
¸ðµç ÆÄ¶ó¹ÌÅÍµéÀº ÇÁ·Î±×·¥ ÄÚµå¿¡¼­ ½±°Ô ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ÆÄ¶ó¹ÌÅÍµéÀº
<tt>&lt;asm/termbits.h></tt>¿¡ Á¤ÀÇµÇ¾î ÀÖ´Â <tt>struct termios</tt>
±¸Á¶Ã¼¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.

<verb>
       #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 */
       };
</verb>

ÀÌ ÆÄÀÏÀº ¸ðµç flagµéÀ» Á¤ÀÇÇÏ°í ÀÖ´Ù. <tt>c_iflag</tt>(ÀÔ·Â ¸ðµå flag)´Â
¸ðµç ÀÔ·Â Ã³¸®(input processing)¸¦ Á¤ÀÇÇÑ´Ù.
ÀÔ·Â Ã³¸®¶õ <tt>read()</tt> ÇÔ¼ö¿¡ ÀÇÇØ ½Ã¸®¾ó Æ÷Æ®·Î µé¾î¿Â µ¥ÀÌÅÍ¸¦
<tt>read</tt>¿¡ ÀÇÇØ ÀÐ±â Àü¿¡ µ¥ÀÌÅÍµéÀ» <tt>c_iflag</tt>¿¡
Á¤ÀÇÇÑ ´ë·Î Ã³¸®ÇÏ´Â °ÍÀ» ÀÇ¸¶ÇÑ´Ù. <tt>c_oflag</tt>(Ãâ·Â ¸ðµå flag)´Â
Ãâ·Â Ã³¸®(output processing) ÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÑ´Ù.
<tt>c_cflag</tt>(Á¦¾î ¸ðµå flag)´Â baudrate, data bits, stop bits µîÀÇ
Æ÷Æ® ¼¼ÆÃÀ» Á¤ÀÇÇÑ´Ù. <tt>c_lflag</tt>(local ¸ðµå flag)´Â echo¸¦
ÇÒ °ÍÀÎÁö µîÀ» °áÁ¤ÇÑ´Ù. ¸¶Áö¸·À¸·Î <tt>c_cc</tt>(Á¦¾î ¹®ÀÚ) ¹è¿­Àº
EOF(End of File), STOP µîÀÇ Á¦¾î µ¿ÀÛµéÀ»
¾î¶² ¹®ÀÚ·Î Á¤ÀÇÇÒ °ÍÀÎ°¡¸¦ ¼³Á¤ÇÑ´Ù. Á¦¾î ¹®ÀÚÀÇ µðÆúÆ® ¹®ÀÚ´Â
<tt>&lt;asm/termios.h></tt>¿¡ Á¤ÀÇµÇ¾î ÀÖ´Ù. À§ flagµé¿¡ °üÇÑ ¼³¸íÀº
<tt>termios(3)</tt> man page¿¡ ³ª¿ÍÀÖ´Ù. <tt>termios</tt> ±¸Á¶Ã¼ÀÇ
<tt>c_line</tt> Ç×¸ñÀº POSIX È£È¯ ½Ã½ºÅÛ¿¡¼­ »ç¿ëµÇÁö ¾Ê´Â´Ù.


<sect1>½Ã¸®¾ó ÀåÄ¡ÀÇ ÀÔ·Â ¹æ¹ý

<p>
ÀÌ ¼½¼Ç¿¡¼­´Â ¼¼ °¡ÁöÀÇ ÀÔ·Â ¹æ¹ýÀ» ±â¼úÇÏ±â·Î ÇÑ´Ù. ÀÀ¿ë ºÐ¾ß¿¡ µû¶ó¼­
¾Ë¸ÂÀº ¹æ¹ýÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ÇÑ ¹®ÀÚ¾¿ ÀÐ´Â ·çÇÁ¸¦ µ¹·Á¼­ ÀüÃ¼ ¹®ÀÚ¿­À»
¹Þ´Â ¹æ¹ýÀº °¡´ÉÇÏ´Ù¸é ÇÇÇØ¾ß ÇÑ´Ù. ³»°¡ ÀÌ·± ¹æ¹ýÀ¸·Î ÇßÀ» ¶§,
¹®ÀÚ¸¦ ÀÒ¾î¹ö¸®´Â °æ¿ì°¡ »ý±ä ¹Ý¸é, ÀüÃ¼ ¹®ÀÚ¿­À» ÇÑ¹ø¿¡ ÀÐÀ» ¶§´Â
¿¡·¯°¡ ¹ß»ýÇÏÁö ¾Ê¾Ò´Ù.


<sect2>Canonical ÀÔ·Â Ã³¸®(Canonical Input Processing)

<p>
Canonical ÀÔ·Â Ã³¸®´Â ÅÍ¹Ì³ÎÀÇ ±âº» Ã³¸® ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀº ÇÑ ÁÙ ´ÜÀ§·Î
Ã³¸®ÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥°ú Åë½ÅÇÏ´Âµ¥¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÑ ÁÙÀº µðÆúÆ®·Î <tt>NL</tt>(New Line, ASCII´Â <tt>LF</tt>) ¹®ÀÚ,
EOF(End of File) ¹®ÀÚ, È¤Àº EOL(End of Line)¿¡ ÀÇÇØ Á¾·áµÇ´Â
¹®ÀÚ¿­À» ÀÇ¹ÌÇÑ´Ù. <tt>CR</tt>(Carriage Return, DOS/WindowsÀÇ
µðÆúÆ® EOL ¹®ÀÚÀÓ) ¹®ÀÚ´Â µðÆúÆ® ¼¼ÆÃ¿¡¼­ ÇÑ ÁÙÀÇ Á¾·á ¹®ÀÚ·Î
ÀÎ½ÄµÇÁö ¾Ê´Â´Ù.

<p>
¶ÇÇÑ Canonical ÀÔ·Â Ã³¸® ¸ðµå¿¡¼­´Â ERASE, DELETE WORD, REPRINT CHARACTERS
¹®ÀÚµéÀ» Ã³¸®ÇÒ ¼ö ÀÖ°í, <tt>CR</tt> ¹®ÀÚ¸¦ <tt>NL</tt> ¹®ÀÚ·Î
º¯È¯ Ã³¸®¸¦ ÇÒ ¼ö ÀÖ´Ù.


<sect2>Non-Canonical ÀÔ·Â Ã³¸®(Non-Canonical Input Processing)

<p>
Non-Canonical ÀÔ·Â Ã³¸® ¸ðµå¿¡¼­´Â ÇÑ ¹ø ÀÐÀ» ¶§¸¶´Ù Á¤ÇØÁø Å©±âÀÇ ¹®ÀÚ¸¸À»
ÀÐ¾î³¾ ¼ö ÀÖ´Ù. ¶ÇÇÑ Å¸ÀÌ¸Ó¸¦ µÎ¾î¼­ ÀÏÁ¤ ½Ã°£±îÁö <tt>read()</tt>°¡
¸®ÅÏÇÏÁö ¾Ê´Â °æ¿ì °­Á¦ ¸®ÅÏÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¸ðµå´Â Ç×»ó Á¤ÇØÁø
Å©±âÀÇ ¹®ÀÚµé¸¸À» ÀÐ¾î³»°Å³ª ´ë·®ÀÇ ¹®ÀÚµéÀ» Àü¼ÛÇÏ°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù.


<sect2>ºñµ¿±â ÀÔ·Â

<p>
À§¿¡¼­ ¼³¸íÇÑ µÎ °¡Áö ¸ðµå´Â µ¿±â ¹æ½ÄÀÌ³ª ºñµ¿±â ¹æ½ÄÀ¸·Î
»ç¿ëµÉ ¼ö ÀÖ´Ù. µ¿±â ¹æ½ÄÀº <tt>read</tt>ÀÇ Á¶°ÇÀÌ ¸¸Á·µÉ ¶§±îÁö
blockµÇ´Â ¹æ½ÄÀ¸·Î¼­ µðÆúÆ®·Î ¼³Á¤µÇ¾î ÀÖ´Ù. ºñµ¿±â ¹æ½Ä¿¡¼­´Â
<tt>read()</tt> ÇÔ¼ö°¡ ¹Ù·Î ¸®ÅÏµÇ¸ç, È£ÃâÇÑ ÇÁ·Î±×·¥¿¡°Ô
signalÀ» º¸³½´Ù. ÀÌ signalÀº signal handler(½Ã±×³Î Ã³¸® ÇÔ¼ö)·Î
º¸³»Áø´Ù.


<sect2>ÀÔ·ÂÀåÄ¡ ¸ÖÆ¼ÇÃ·º½Ì

<p>
À§¿¡¼­ ¼³¸íÇÑ ÀÔ·Â ¸ðµå¿¡ ÇØ´çÇÏÁø ¾ÊÁö¸¸ ¿©·¯ °³ÀÇ ÀåÄ¡µéÀ» ´Ù·ç°íÀÚ ÇÒ ¶§
À¯¿ëÇÏ´Ù. ¿¹¸¦ µé¾î ³» ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ TCP/IP ¼ÒÄÏ°ú ½Ã¸®¾ó Åë½Å¿¡¼­ µ¿½Ã¿¡
ÀÔ·ÂÀ» ¹Þ¾Æ¾ß Çß´Ù. ¾Æ·¡ 3.4ÀÇ ¿¹Á¦´Â µÎ °³ÀÇ ¼­·Î ´Ù¸¥ ÀåÄ¡·ÎºÎÅÍ µ¿½Ã¿¡
ÀÔ·ÂÀ» ±â´Ù¸®´Â ÄÚµåÀÌ´Ù. µÑ Áß ÇÑ °³ÀÇ ÀåÄ¡¿¡¼­ ÀÔ·ÂÀÌ µé¾î¿À¸é Ã³¸®¸¦ ÇÏ°í
¶Ç ´Ù½Ã »õ·Î¿î ÀÔ·ÂÀÌ ¿Ã ¶§±îÁö ±â´Ù¸°´Ù.

<p>
¾Æ·¡ 3.4ÀÇ ¿¹Á¦´Â º¹ÀâÇØ º¸ÀÏ ¼ö ÀÖÁö¸¸, ¸®´ª½º°¡ multi-processing OSÀÓÀ»
¾Ë°í ÀÖ±â¿¡ ¸Å¿ì Áß¿äÇÏ´Ù. <tt>select()</tt> ½Ã½ºÅÛ È£Ãâ ÇÔ¼ö´Â ÀÔ·ÂÀ»
±â´Ù¸®´Â µ¿¾È CPU¿¡ ºÎÇÏ¸¦ ÁÖÁö ¾Ê´Â´Ù. ¹Ý¸é ÀÔ·ÂÀÌ µé¾î¿Ô´ÂÁö
·çÇÁ¸¦ µ¹¸é¼­ Ã¼Å©ÇÏ´Â polling ¹æ½ÄÀº ½Ã½ºÅÛ¿¡ ºÎÇÏ¸¦ ÁÖ°Ô µÇ¾î
´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¼öÇà ¼Óµµ¸¦ ÀúÇÏ½ÃÅ°°Ô µÈ´Ù.

 

<sect>ÇÁ·Î±×·¥ ¿¹Á¦

<p>
¿©±âÀÇ ¸ðµç ¿¹Á¦´Â <tt>miniterm.c</tt>¿¡¼­ µû¿Ô´Ù. Canonical ÀÔ·Â Ã³¸®¿¡¼­
Ã³¸®ÇÒ ¼ö ÀÖ´Â ÃÖ´ë ±æÀÌÀÇ ¹®ÀÚ´Â 255°³(<tt>&lt;linux/limits.h></tt>
È¤Àº <tt>&lt;posix1_lim.h></tt>¿¡ Á¤ÀÇµÊ) ·Î¼­ ¹öÆÛÀÇ ÃÖ´ë ±æÀÌ´Â
255·Î Á¦ÇÑµÈ´Ù.

<p>
¿©·¯ ÀÔ·Â Ã³¸® ¸ðµåÀÇ »ç¿ë¹ý¿¡ ´ëÇÑ ¼³¸íÀ» ¿øÇÏ¸é ÄÚµå ³»ÀÇ comment¸¦ ÂüÁ¶ÇÏ¶ó.
ÄÚµå°¡ ÀÌÇØÇÏ±â ½±±â¸¦ ¹Ù¶õ´Ù. Canonical ÀÔ·Â Ã³¸® ¸ðµåÀÇ ¿¹Á¦´Â comment¸¦
°¡Àå Àß ÇØ³õ¾Ò´Ù. ´Ù¸¥ ¿¹Á¦´Â canonical ¸ðµå ¿¹Á¦¿Í ´Ù¸¥ ºÎºÐ¿¡¸¸ comment¸¦
´Þ¾Ò´Ù.

<p>
¼³¸íÀÌ ¿Ïº®ÇÏÁø ¾ÊÁö¸¸, ÀÌ ¿¹Á¦·Î Á÷Á¢ Å×½ºÆ®¸¦ ÇØº¸¸é ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡
Àû¿ëÇÒ ¶§ ÃÖÀûÀÇ ¹æ¹ýÀ» Ã£À» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

<p>
½Ã¸®¾ó Æ÷Æ® ÀåÄ¡ ÆÄÀÏÀÇ ¼±ÅÃÀ» Á¦´ë·Î Çß´Â°¡¸¦ ´Ù½Ã ÇÑ ¹ø È®ÀÎÇÏ°í, ÆÄÀÏ Á¢±Ù
Çã°¡´Â Á¦´ë·Î µÇ¾î ÀÖ´ÂÁö º¸±â¸¦ ¹Ù¶õ´Ù.
(¿¹: <tt>chmod a+rw /dev/ttyS1</tt>)


<sect1>Canonical ÀÔ·Â Ã³¸®(Canonical Input Processing)


<p>
<verb>

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

  /* Baudrate ¼³Á¤Àº <asm/termbits.h>¿¡ Á¤ÀÇµÇ¾î ÀÖ´Ù.
  /* <asm/termbits.h>´Â <termios.h>¿¡¼­ includeµÈ´Ù. */
  #define BAUDRATE B38400
  /* ¿©±âÀÇ Æ÷Æ® ÀåÄ¡ ÆÄÀÏÀ» ¹Ù²Û´Ù. COM1="/dev/ttyS1, COM2="/dev/ttyS2 */
  #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];

  /* ÀÐ±â/¾²±â ¸ðµå·Î ¸ðµ© ÀåÄ¡¸¦ ¿¬´Ù.(O_RDWR)
     µ¥ÀÌÅÍ Àü¼Û ½Ã¿¡ <CTRL>-C ¹®ÀÚ°¡ ¿À¸é ÇÁ·Î±×·¥ÀÌ Á¾·áµÇÁö ¾Êµµ·Ï
     ÇÏ±â À§ÇØ controlling tty°¡ ¾ÈµÇµµ·Ï ÇÑ´Ù.(O_NOCTTY)
  */
   fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
   if (fd <0) {perror(MODEMDEVICE); exit(-1); }

   tcgetattr(fd,&amp;oldtio); /* save current serial port settings */
   bzero(&amp;newtio, sizeof(newtio)); /* clear struct for new port settings */

  /*
    BAUDRATE: Àü¼Û ¼Óµµ. cfsetispeed() ¹× cfsetospeed() ÇÔ¼ö·Îµµ ¼¼ÆÃ °¡´É
    CRTSCTS : ÇÏµå¿þ¾î Èå¸§ Á¦¾î. (½Ã¸®¾ó ÄÉÀÌºíÀÌ ¸ðµç ÇÉ¿¡ ¿¬°áµÇ¾î ÀÖ´Â
              °æ¿ì¸¸ »ç¿ëÇÏµµ·Ï ÇÑ´Ù. Serial-HOWTOÀÇ 7ÀåÀ» ÂüÁ¶ÇÒ °Í.)
    CS8     : 8N1 (8bit, no parity, 1 stopbit)
    CLOCAL  : Local connection. ¸ðµ© Á¦¾î¸¦ ÇÏÁö ¾Ê´Â´Ù.
    CREAD   : ¹®ÀÚ ¼ö½ÅÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù.
  */
   newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

  /*
   IGNPAR   : Parity ¿¡·¯°¡ ÀÖ´Â ¹®ÀÚ ¹ÙÀÌÆ®¸¦ ¹«½ÃÇÑ´Ù.
   ICRNL    : CR ¹®ÀÚ¸¦ NL ¹®ÀÚ·Î º¯È¯ Ã³¸®ÇÑ´Ù. (ÀÌ ¼³Á¤À» ¾ÈÇÏ¸é ´Ù¸¥
              ÄÄÇ»ÅÍ´Â CR ¹®ÀÚ¸¦ ÇÑ ÁÙÀÇ Á¾·á¹®ÀÚ·Î ÀÎ½ÄÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù.)
    otherwise make device raw (no other input processing)
  */
   newtio.c_iflag = IGNPAR | ICRNL;

  /*
   Raw output.
  */
   newtio.c_oflag = 0;

   ICANON   : canonical ÀÔ·ÂÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù.
    disable all echo functionality, and don't send signals to calling program
  */
   newtio.c_lflag = ICANON;

  /*
    ¸ðµç Á¦¾î ¹®ÀÚµéÀ» ÃÊ±âÈ­ÇÑ´Ù.
    µðÆúÆ® °ªÀº <termios.h> Çì¾î ÆÄÀÏ¿¡¼­ Ã£À» ¼ö ÀÖ´Ù. ¿©±â comment¿¡µµ
    Ãß°¡·Î ´Þ¾Æ³õ¾Ò´Ù.
  */
   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;     /* inter-character timer unused */
   newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
   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' */

  /*
    ÀÌÁ¦ modem ¶óÀÎÀ» ÃÊ±âÈ­ÇÏ°í Æ÷Æ® ¼¼ÆÃÀ» ¸¶Ä£´Ù.
  */
   tcflush(fd, TCIFLUSH);
   tcsetattr(fd,TCSANOW,&amp;newtio);

  /*
    ÅÍ¹Ì³Î ¼¼ÆÃÀÌ ³¡³µ°í, ÀÌÁ¦´Â ÀÔ·ÂÀ» Ã³¸®ÇÑ´Ù.
    ÀÌ ¿¹Á¦¿¡¼­´Â ÇÑ ÁÙÀÇ ¸Ç Ã¹ ¹®ÀÚ¸¦ 'z'·Î ÇßÀ» ¶§ ÇÁ·Î±×·¥À»
    Á¾·áÇÑ´Ù.
  */

   while (STOP==FALSE) {     /* Á¾·á Á¶°Ç(STOP==TRUE)°¡ µÉ ¶§±îÁö ·çÇÁ */
   /* read()´Â ¶óÀÎ Á¾·á ¹®ÀÚ°¡ ³ª¿Ã ¶§±îÁö 255 ¹®ÀÚ¸¦ ³Ñ¾î°¡´õ¶óµµ
      block µÈ´Ù. read ÇÏ°íÀÚ ÇÏ´Â ¹®ÀÚ °³¼ö°¡ ÀÔ·Â °¡´ÉÇÑ ¹®ÀÚ °³¼öº¸´Ù
      ÀûÀº °æ¿ì¿¡´Â ¶Ç ÇÑ¹øÀÇ read¸¦ ÇÏ¿© ³ª¸ÓÁö¸¦ ÀÐ¾î³¾ ¼ö ÀÖ´Ù.
      res´Â read¿¡ ÀÇÇØ¼­ ½ÇÁ¦·Î ÀÐÇôÁø ¹®ÀÚÀÇ °³¼ö¸¦ °®°Ô µÈ´Ù. */
      
      res = read(fd,buf,255);
      buf[res]=0;             /* set end of string, so we can printf */
      printf(":%s:%d\n", buf, res);
      if (buf[0]=='z') STOP=TRUE;
   }
   /* restore the old port settings */
   tcsetattr(fd,TCSANOW,&amp;oldtio);
  }

</verb>


<sect1>Non-Canonical ÀÔ·Â Ã³¸®(Non-Canonical Input Processing)

<p>
Non-Canonical ÀÔ·Â Ã³¸® ¸ðµå¿¡¼­´Â ÀÔ·ÂÀÌ ÇÑ ÁÙ ´ÜÀ§·Î Ã³¸®µÇÁö ¾Ê´Â´Ù.
erase, kill, delete µîÀÇ ÀÔ·Â Ã³¸®µµ ¼öÇàµÇÁö ¾Ê´Â´Ù. ÀÌ ¸ðµå¿¡¼­ ¼³Á¤ÇÏ´Â
ÆÄ¶ó¹ÌÅÍ´Â <tt>c_cc[VTIME]</tt>°ú <tt>c_cc[VMIN]</tt> µÎ °¡ÁöÀÌ´Ù.
<tt>c_cc[VTIME]</tt>Àº Å¸ÀÌ¸ÓÀÇ ½Ã°£À» ¼³Á¤ÇÏ°í, <tt>c_cc[VMIN]</tt>Àº
<tt>read</tt>ÇÒ ¶§ ¸®ÅÏµÇ±â À§ÇÑ ÃÖ¼ÒÀÇ ¹®ÀÚ °³¼ö¸¦ ÁöÁ¤ÇÑ´Ù.

<descrip>
<tag>MIN > 0, TIME = 0</tag>
MINÀº <tt>read</tt>°¡ ¸®ÅÏµÇ±â À§ÇÑ ÃÖ¼ÒÇÑÀÇ ¹®ÀÚ °³¼ö.
TIMEÀÌ 0ÀÌ¸é Å¸ÀÌ¸Ó´Â »ç¿ëµÇÁö ¾Ê´Â´Ù.(¹«ÇÑ´ë·Î
±â´Ù¸°´Ù.)

<p>
<tag>MIN = 0, TIME > 0</tag>
TIMEÀº time-out °ªÀ¸·Î »ç¿ëµÈ´Ù. Time-out °ªÀº
TIME * 0.1 ÃÊÀÌ´Ù. Time-outÀÌ ÀÏ¾î³ª±â Àü¿¡
ÇÑ ¹®ÀÚ¶óµµ µé¾î¿À¸é <tt>read</tt>´Â ¸®ÅÏµÈ´Ù. 

<p>
<tag>MIN > 0, TIME > 0</tag>
TIMEÀº time-outÀÌ ¾Æ´Ñ inter-character Å¸ÀÌ¸Ó·Î
µ¿ÀÛÇÑ´Ù. ÃÖ¼Ò MIN °³ÀÇ ¹®ÀÚ°¡ µé¾î¿À°Å³ª
µÎ ¹®ÀÚ »çÀÌÀÇ ½Ã°£ÀÌ TIME °ªÀ» ³ÑÀ¸¸é ¸®ÅÏµÈ´Ù.
¹®ÀÚ°¡ Ã³À½ µé¾î¿Ã ¶§ Å¸ÀÌ¸Ó´Â µ¿ÀÛÀ» ½ÃÀÛÇÏ°í
ÀÌÈÄ ¹®ÀÚ°¡ µé¾î¿Ã ¶§¸¶´Ù Àç½ÃÀÛµÈ´Ù.

<p>
<tag>MIN = 0, TIME = 0</tag>
<tt>read</tt>´Â Áï½Ã ¸®ÅÏµÈ´Ù. ÇöÀç ÀÐÀ» ¼ö ÀÖ´Â ¹®ÀÚÀÇ °³¼ö³ª
¿äÃ»ÇÑ ¹®ÀÚ °³¼ö°¡ ¹ÝÈ¯µÈ´Ù. Antonino¾¾¿¡ ÀÇÇÏ¸é
<tt>read</tt>ÇÏ±â Àü¿¡ <tt>fcntl(fd, F_SETFL, FNDELAY);</tt> ¸¦
È£ÃâÇÏ¸é ¶È°°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
</descrip>

<p>
<tt>newtio.c_cc[VTIME]</tt>°ú <tt>newtio.c_cc[VMIN]</tt>À»
¼öÁ¤ÇÏ¿© À§ ³× °¡Áö ¹æ½ÄÀ» Å×½ºÆ® ÇÒ ¼ö ÀÖ´Ù.


<verb>
       #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 compliant source */
       #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,&amp;oldtio); /* ÇöÀç ¼³Á¤À» oldtio¿¡ ÀúÀå */

        bzero(&amp;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;   /* ¹®ÀÚ »çÀÌÀÇ timer¸¦ disable */
        newtio.c_cc[VMIN]     = 5;   /* ÃÖ¼Ò 5 ¹®ÀÚ ¹ÞÀ» ¶§±îÁø blocking */

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


        while (STOP==FALSE) {       /* loop for input */
          res = read(fd,buf,255);   /* ÃÖ¼Ò 5 ¹®ÀÚ¸¦ ¹ÞÀ¸¸é ¸®ÅÏ */
          buf[res]=0;               /* '\0' Á¾·á ¹®ÀÚ¿­(printf¸¦ ÇÏ±â À§ÇØ) */
          printf(":%s:%d\n", buf, res);
          if (buf[0]=='z') STOP=TRUE;
        }
        tcsetattr(fd,TCSANOW,&amp;oldtio);
       }

</verb>


<sect1>ºñµ¿±â ÀÔ·Â


<p>
<verb>

  #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 compliant source */
  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  void signal_handler_IO (int status);   /* signal handler ÇÔ¼ö Á¤ÀÇ */
  int wait_flag=TRUE;                    /* signalÀ» ¹ÞÁö ¾ÊÀº µ¿¾ÈÀº TRUE */

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    struct sigaction saio;           /* signal actionÀÇ Á¤ÀÇ */
    char buf[255];

    /* Non-blocking ¸ðµå·Î ½Ã¸®¾ó ÀåÄ¡¸¦ ¿¬´Ù(read ÇÔ¼ö È£Ãâ ÈÄ Áï°¢ ¸®ÅÏ) */
    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd <0) {perror(MODEMDEVICE); exit(-1); }

    /* install the signal handler before making the device asynchronous */
    /* ÀåÄ¡¸¦ ºñµ¿±â ¸ðµå·Î ¸¸µé±â Àü¿¡ signal handler */
    saio.sa_handler = signal_handler_IO;
    saio.sa_mask = 0;
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO,&amp;saio,NULL);

    /* SIGIO signalÀ» ¹ÞÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù. */
    fcntl(fd, F_SETOWN, getpid());
    /* file descriptor¸¦ ºñµ¿±â·Î ¸¸µç´Ù. (manual page¸¦ º¸¸é
       O_APPEND ¿Í O_NONBLOCK¸¸ÀÌ F_SETFL¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù°í µÇ¾î ÀÖ´Ù.) */
    fcntl(fd, F_SETFL, FASYNC);

    tcgetattr(fd,&amp;oldtio); /* save current port settings */
    /* canonical ÀÔ·ÂÃ³¸®¸¦ À§ÇÑ Æ÷Æ® ¼¼ÆÃ */
    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,&amp;newtio);

    /* loop while waiting for input. normally we would do something
       useful here */
    while (STOP==FALSE) {
      printf(".\n");usleep(100000);
      /* after receiving SIGIO, wait_flag = FALSE, input is available
         and can be read */
      if (wait_flag==FALSE) {
        res = read(fd,buf,255);
        buf[res]=0;
        printf(":%s:%d\n", buf, res);
        if (res==1) STOP=TRUE; /* stop loop if only a CR was input */
        wait_flag = TRUE;      /* wait for new input */
      }
    }
    /* restore old port settings */
    tcsetattr(fd,TCSANOW,&amp;oldtio);
  }

  /***************************************************************************
  * signal handler. sets wait_flag to FALSE, to indicate above loop that     *
  * characters have been received.                                           *
  ***************************************************************************/

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


</verb>



<sect1>ÀÔ·Â ÀåÄ¡ ¸ÖÆ¼ÇÃ·º½Ì

<p>
ÀÌ ¼½¼ÇÀº °£·«ÇÑ ¼³¸í¸¸À» ÇÏ°Ú´Ù. ¾î¶»°Ô ÇÏ´Â Áö¿¡ ´ëÇÑ °£´ÜÇÑ ÈùÆ®¸¸À» ÁÖ±â
À§ÇÑ °ÍÀÌ¹Ç·Î ÂªÀº ¿¹Á¦ ÄÚµå¸¸À» ´ã¾Ò´Ù. ÀÌ ¹æ¹ýÀº ½Ã¸®¾ó Æ÷Æ®¿¡¸¸ Àû¿ëµÇ´Â
°ÍÀÌ ¾Æ´Ï¶ó file descriptor¸¦ »ç¿ëÇÏ´Â ¸ðµç ÀÔÃâ·Â¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

<p>
<tt>select()</tt> ½Ã½ºÅÛ È£Ãâ ÇÔ¼ö¿Í ÇØ´çÇÏ´Â ¸ÅÅ©·Î ÇÔ¼öµéÀº
<tt>fd_set</tt>À» »ç¿ëÇÑ´Ù. <tt>fd_set</tt>´Â bit array·Î¼­
file descriptorÀÇ bit entry·Î ÀÛ¿ëÇÑ´Ù.
<tt>select()</tt>´Â ÇØ´çÇÏ´Â file descriptorÀÇ bitµéÀ» ¼¼ÆÃÇÑ
<tt>fd_set</tt>À» ÀÔ·Â ÆÄ¶ó¹ÌÅÍ·Î ¹Þ¾Æ¼­ ÀÔ·Â, Ãâ·Â È¤Àº
¿¹¿Ü ¹ß»ýÀÌ ÀÏ¾î³­ °æ¿ì ¸®ÅÏÇÑ´Ù. <tt>fd_set</tt>Àº
<tt>FD_</tt>·Î ½ÃÀÛÇÏ´Â ¸ÅÅ©·Î ÇÔ¼öµéÀ» ÅëÇØ¼­ °ü¸®ÇÑ´Ù.
<tt>select(2)</tt>ÀÇ man page¸¦ ÂüÁ¶ÇÏ¶ó.


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

  main()
  {
     int    fd1, fd2;  /* input sources 1 and 2 */
     fd_set readfs;    /* file descriptor set */
     int    maxfd;     /* maximum file desciptor used */
     int    loop=1;    /* loop while TRUE */

     /* open_input_source opens a device, sets the port correctly, and
        returns a file descriptor */
     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;  /* maximum bit entry (fd) to test */

     /* loop for input */
     while (loop) {
       FD_SET(fd1, &amp;readfs);  /* set testing for source 1 */
       FD_SET(fd2, &amp;readfs);  /* set testing for source 2 */
       /* block until input becomes available */
       select(maxfd, &amp;readfs, NULL, NULL, NULL);
       if (FD_ISSET(fd1, &amp;readfs))     /* input from source 1 available */
         handle_input_from_source1();
       if (FD_ISSET(fd2, &amp;readfs))     /* input from source 2 available */
         handle_input_from_source2();
     }

  }
</verb>

À§ÀÇ ¿¹Á¦ ÄÚµå´Â ÀÔ·ÂÀÌ µé¾î¿Ã ¶§±îÁö °è¼Ó block µÇ´Â µ¿ÀÛÀ» º¸¿©ÁØ´Ù.
Time-outÀÌ ÇÊ¿äÇÏ´Ù¸é, ´ÙÀ½°ú °°ÀÌ ¹Ù²Û´Ù.

<verb>
       int res;
       struct timeval Timeout;

       /* set timeout value within input loop */
       Timeout.tv_usec = 0;  /* milliseconds */
       Timeout.tv_sec  = 1;  /* seconds */
       res = select(maxfd, &amp;readfs, NULL, NULL, &amp;Timeout);
       if (res==0)
       /* number of file descriptors with input = 0, timeout occurred. */


</verb>
ÀÌ ¿¹Á¦´Â 1ÃÊ ÈÄ¿¡ time-outÀÌ µÇ´Â °ÍÀ» º¸¿©ÁØ´Ù. Time-outÀÌ ÀÏ¾î³ª¸é
<tt>select()</tt>´Â 0À» ¹ÝÈ¯ÇÑ´Ù. ¿©±â¼­ ÁÖÀÇÇÒ Á¡Àº,
¼³Á¤ÇÑ <tt>Timeout</tt> °ªÀº <tt>select()</tt>¿¡ ÀÇÇØ¼­ °¨¼ÒÇÏ±â ¶§¹®¿¡
´Ù½Ã <tt>select()</tt>¸¦ È£ÃâÇÑ´Ù¸é <tt>Timeout.tv_usec</tt>°ú
<tt>Timeout.tv_sec</tt> °ªÀ» ´Ù½Ã ¼³Á¤ÇØ¾ß ÇÑ´Ù.
<tt>Timeout</tt> °ªÀÌ 0ÀÌ µÇ¸é time-outÀÌ ¹ß»ýÇÏ°í
<tt>select()</tt>´Â Áï½Ã ¸®ÅÏµÈ´Ù.




<sect>´Ù¸¥ À¯¿ëÇÑ Á¤º¸

<p>
<itemize>
<item><em>Serial-HOWTO</em> ¹®¼­´Â ½Ã¸®¾ó Æ÷Æ®¸¦ ¾î¶»°Ô ¼Â¾÷ÇÏ´ÂÁö¸¦
¼³¸íÇÏ°í ÇÏµå¿þ¾î Á¤º¸¸¦ Á¦°øÇÑ´Ù.

<item>Michael SweetÀÇ <url url="http://www.easysw.com/~mike/serial"
name="Serial Programming Guide for POSIX Compliant Operating Systems">.
ÀÌ ¸µÅ©´Â ¿¾³¯ °ÍÀÌ°í ÃÖ½Å À§Ä¡¸¦ Ã£À» ¼ö°¡ ¾ø´Ù.
ÀÌ°Å Ã£¾ÆÁÙ ºÐ ´©±¸ ¾ø¼ö? ÀÌ ¹®¼­´Â ¸Å¿ì Àß Á¤¸®µÈ °ÍÀÌ´Ù.
(¿ªÀÚ ÁÖ: ´Ù½Ã ÀÌ À§Ä¡°¡ ºÎÈ°Çß´Ù. ¿¹Àü¿¡ Àá½Ã Æó¼âµÈ ÀûÀÌ ÀÖ¾ú´Ù.)

<item><tt>termios(3)</tt> man page´Â <tt>termios</tt> ±¸Á¶Ã¼ÀÇ
¸ðµç flag¿¡ ´ëÇØ Á¤ÀÇµÇ¾î ÀÖ´Ù.
</itemize>


<sect>±â¿©ÇÑ »ç¶÷µé

<p>
1ÀåÀÇ ¼Ò°³ ºÎºÐ¿¡¼­ ¾ð±ÞÇßµíÀÌ, ³ª´Â ÀÌ ºÐ¾ßÀÇ Àü¹®°¡°¡ ¾Æ´Ï´Ù. ±×·¯³ª ¿©·¯
¹®Á¦¿¡ ºÎµúÇû¾ú°í, ´Ù¸¥ ÀÌµéÀÇ µµ¿òÀ» ¹Þ¾Æ¼­ ¹®Á¦µéÀ» ÇØ°áÇß´Ù.
Strudthoff ¾¾, Michael Carter(<tt>mcarter@rocke.electro.swri.edu</tt>)¾¾
¹× Peter Walternberg(<tt>p.waltenberg@karaka.chch.cri.nz</tt>) ¾¾ÀÇ
µµ¿ò¿¡ °¨»çÇÑ´Ù.

<p>
Antonino Ianella(<tt>antonino@usa.net</tt>)¾¾´Â ³»°¡ ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇÒ ¶§
<em>Serial-Port-Programming Mini HOWTO</em>¸¦ ½è´Ù.
Greg Hankins¾¾´Â AntoninoÀÇ Mini-HOWTO¸¦ ÀÌ ¹®¼­¿¡ ³ÖÀ¸¶ó°í ±ÇÇß´Ù.

<p>
ÀÌ ¹®¼­ÀÇ ±¸Á¶¿Í SGML Æ÷¸ËÀº Greg Hankins¾¾ÀÇ <em>Serial-HOWTO</em>¿¡¼­
µû¿Ô´Ù. ÀÌ ±Û¿¡¼­ ¿À·ù¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ½Å ¸¹Àº ºÐµéÀÌ ÀÖ´Ù.
Dave Pfaltzgraff(<tt>Dave_Pfaltzgraff@patapsco.com</tt>),
Sean Lincolne(<tt>slincol@tpgi.com.au</tt>),
Michael Wiedmann(<tt>mw@miwie.in-berlin.de</tt>),
Adrey Bonar(<tt>andy@tipas.lt</tt>) ¾¾¿¡°Ô °¨»çÇÑ´Ù.


</article>
