Powered by AdLogger, Click Fraud Protection.
HOME | WIKI | JOINC RSS | °Ô½ÃÆÇ RSS    lynx ¿¡¼­µµ (±¤°í¸¸ »©°í)¹®Á¦¾øÀÌ º¸ÀÌ´Â »çÀÌÆ® JOINC
WIKI ÆäÀÌÁö
x man page
x ¹Ì´Ï»çÀÌÆ®
x Àüü±â»ç¸ñ·Ï
x ±â»çÁÖÁ¦º°
x Á¶°¢ÄÚµå
x ÆÁ¸ðÀ½
x ´ÚºÏ¿ø¹®µé
x ÄÄÇ»ÅÍ¿ë¾î»çÀü
x FAQ
x JCvs
x ¸µÅ©¸ðÀ½
x ÀÚ·á¹æ

·Î±×ÀÎ
¾ÆÀ̵ð

ÆÐ½º¿öµå

°¡ÀÔÇϱâ

°Ô½ÃÆÇ
x ¹¯°í´äÇϱâ
x ²ôÀûÀ̱â
x ÆÁ¸ðÀ½
x »õ¼Ò½Ä
x ±¤°í/È«º¸
x Á¦¾È¹× Àǰß

Åë°è
MRTG Æ®·¡ÇÈÁ¤º¸
À¥·Î±×ºÐ¼® º¸±â
Á¢±ÙÁ¤º¸ º¸±â
3,054 ÀÏ ¿î¿µÁß

´º½º±×·ì
han.comp.lang.c
han.comp.lang.c++

±âº»¹®¼­
o ÀÌ »çÀÌÆ®¿¡ ´ëÇØ¼­
o Âü¿©Çϱâ
o docbook »ç¿ëÇϱâ
o vim »ç¿ëÇϱâ
o C++ÇÁ·Î±×·¡¹Ö HOWTO
o CÇÁ·Î±×·¡¹Ö FAQ

   ÀλýÀº ´ÙÀ½ µÎ°¡Áö·Î ¼º¸³µÈ´Ù. ÇÏ°í ½ÍÁö¸¸ ÇÒ ¼ö ¾ø´Ù. ÇÒ ¼ö ÀÖÁö¸¸ ÇÏ°í ½ÍÁö ¾Ê´Ù. - ±«Å× -
Å͹̳ÎÁ¦¾î
Posted on 2002/12/4
Topic: ½Ã½ºÅÛ ÇÁ·Î±×·¥
À̹ø ±â»ç´Â termios °ü·Ã ÇÔ¼ö¸ðÀ½À» ÀÌ¿ëÇÑ Å͹̳ÎÁ¦¾î¿¡ °üÇÑ ³»¿ëÀ» ´Ù·ç¸ç, ±×Áß¿¡¼­µµ ½±°Ô Á¢ÇÒ¼ö Àִ Űº¸µå+¸ð´ÏÅͽÖÀ¸·Î ±¸¼ºµÈ Å͹̳ΰü·Ã ³»¿ëÀ» ´Ù·é´Ù.

Å͹̳ΠÁ¦¾î

1절. Å͹̳Î

1.1절. Å͹̳ÎÀ̶õ ¹«¾ùÀΰ¡ ?

Å͹̳Î(terminal) Àº ¸ð´ÏÅÍ(moniter)¿Í Űº¸µå(keyboard)ÀÇ Á¶ÇÕÀ¸·Î Áö¿ªÀûÀ¸·Î ºÙ¾îÀְųª ȤÀº ¿ø°ÝÀ¸·Î ¿¬°áµÈ ÄÄÇ»ÅÍ¿Í ´ëÈ­Çϱâ À§Çؼ­ »ç¿ëµÇ¸ç, ÀåÄ¡ÀÇ °³³äÀ¸·Î ÀÌÇØÇÒ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â ÇÁ·Î±×·¥À» ½ÇÇà½Ã۱â À§Çؼ­ Űº¸µå¸¦ ÀÌ¿ëÇØ¼­ ¸í·ÉÀ» ½ÇÇà½Ã۸ç, ±× °á°ú´Â ¸ð´ÏÅ͸¦ ÅëÇØ¼­ Ãâ·ÂµÈ´Ù. ¿ì¸®´Â Å͹̳ÎÀÌ ¾øÀÌ´Â ÄÄÇ»Å͸¦ È¿°úÀûÀ¸·Î ´Ù·ê¼ö ¾øÀ»°ÍÀÌ´Ù. - ¸ð´ÏÅÍ+Űº¸µå ´ë½Å¿¡ õ°øÅ×ÀÌÇÁ¸¦ ÅëÇØ¼­ ¸í·ÉÀ» ½ÇÇà½Ã۰í, ±× °á°ú¸¦ ¶óÀÎÇÁ¸°Å͸¦ ÅëÇØ¼­ Ãâ·Â¹Þ´Â ´Ù°í °¡Á¤Çغ¸¶ó -

À¯´Ð½º ½Ã½ºÅÛÀº ±âº»ÀûÀ¸·Î text Å͹̳ÎÀ» »ç¿ëÇϰí ÀÖ´Ù. ÀÌ ÅØ½ºÆ® Å͹̳ÎÀº 1970 ³â´ë ¸ÞÀÎÇÁ·¹ÀÓ(mainframe) ÄÄÇ»ÅÍ¿Í Åë½ÅÇϱâ À§Çؼ­ »ç¿ëÇß¾ú´Âµ¥, ÇÁ·Î±×·¡¸Ó´Â Àü¿ë ÀåÄ¡ (¸ð´ÏÅÍ¿Í Å°º¸µå°¡ ¿¬°áµÈ)¸¦ ÄÉÀ̺í·Î ¸ÞÀÎÇÁ·¹ÀÓ°ú ¿¬°á½ÃŲÈÄ ÇÁ·Î±×·¡¹ÖÀÛ¾÷À» Çϰųª, ¹®¼­¸¦ ¸¸µé°í, ½Ã½ºÅÛÀ» °ü¸®ÇÏ´Â ÀÏÀ» Çß´Ù.

Áö±ÝÀº Å͹̳ÎÀåÄ¡¿Í ¼ÒÇÁÆ®¿þ¾î¿¡ ¸¹Àº ¹ßÀüÀÌ ÀÌ·ç¾îÁ®¼­, ±×´ç½Ã¿Í´Â ºñ±³ÇÒ¼ö ¾ø´Â Æí¸®ÇÑ È¯°æ¿¡¼­ ÀÛ¾÷À» ÇÒ¼ö ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ¸®´ª½º¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é (X Windows°¡ ¾Æ´Ñ) ¾Æ¸¶µµ ¿©·¯°¡Áö ÀÛ¾÷À» À§Çؼ­ Űº¸µå¿Í ¸ð´ÏÅÍ - Å͹̳Π- ¸¦ ÀÌ¿ëÇϰí ÀÖÀ»°ÍÀÌ´Ù. ¶ÇÇÑ CTRL+ALT+F1 ... F6 ۸¦ ÀÌ¿ëÇÏ¸é ¿©·¯°³ÀÇ °¡»ó Å͹̳ÎÀ» ¸¸µé¾î¼­ °¡»ó Å͹̳Π»óÀ» ¿À°¡¸é¼­ µ¿½Ã¿¡ ¸î°³ÀÇ ´Ù¸¥ ÀÛ¾÷À» ¼öÇàÇÒ¼öµµ ÀÖÀ»°ÍÀÌ´Ù.

Ãß°¡ÀûÀ¸·Î ¿©·¯ºÐÀÌ X À©µµ¿ì¸¦ »ç¿ëÇÑ´Ù¸é Å͹̳ÎÀ» Èä³»³»´Â (emulate) ¾îÇø®ÄÉÀ̼ǵéÀ» »ç¿ëÇØ¼­, ¼ö½Ê°³ ÀÌ»óÀÇ Å͹̳ÎÀ» ¶ç¿ö¼­ ÀÚÀ¯ÀÚÀç·Î Å͹̳λóÀ» ¿À°¡¸é¼­ ÀÛ¾÷À» ÇÒ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ Å͹̳Πemulate ÇÁ·Î±×·¥À¸·Î´Â xterm, rxvt, zterm µîÀÌ ÀÖÀ¸¸ç, ÇÑ±Û ÀÔ/Ãâ·ÂÀ» Áö¿ø ±â´ÉÀ» Ãß°¡ÇÑ hanterm µîÀÌ ÀÖ´Ù. ¸¸¾à ¿ÜÇüÀûÀ¸·Î ¾ÆÁÖ ¸ÚÁø Å͹̳Πemulate ¸¦ ±¸ÇÑ´Ù¸é Eterm °ú °°Àº ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇÒ¼öµµ ÀÖÀ»°ÍÀÌ´Ù. À©µµ¿ìÁî¿¡¼­´Â crt, putty µîÀÇ Å͹̳Πemulate ¾îÇø®ÄÉÀ̼ÇÀÌ Á¸ÀçÇÑ´Ù.

ÇöÀç ¿ì¸®°¡ »ç¿ëÇÏ´Â °³ÀÎ PC ´Â Å͹̳ÎÀåÄ¡·Î Űº¸µå¿Í ¸ð´ÏÅ͸¦ ÀÌ¿ëÇϴµ¥, À̵é ÀåÄ¡´Â °¢°¢ ±×·¡ÇÈ Ä«µå¿Í PS/2 Æ÷Æ®¿¡ ¿¬°áµÇ¾î¼­ »ç¿ëµÇ¾îÁø´Ù. ±×·¯³ª À§¿¡¼­ ¿¹¸¦µç ¸ÞÀÎÇÁ·¹ÀÓ, ¶ó¿ìÅÍ ±×¸®°í OS°¡ ³»ÀåµÈ ¸î°¡Áö ¼ÒÇüÀåºñµéÀº ¿À·£¿ª»ç¸¦ Áö´Ï°í ÀÖ´Â serial port(Á÷·ÄÆ÷Æ®) ¿¡ Á÷Á¢ ÄÉÀ̺íÀ» ¿¬°áÇØ¼­ »ç¿ëÇϱ⵵ ÇÑ´Ù. ¶ó¿ìÅÍ¿¡ ¹®Á¦°¡ »ý°Ü¼­ A/S Á÷¿øÀÌ A/S ÇÏ´Â°É º¸¾Ò´Ù¸é ¾Æ¸¶µµ Àü¿ë Å͹̳ÎÀ» serial port (com port) ¿Í ¿¬°áÇØ¼­ ÀÛ¾÷ÇÏ´Â°É º¸¾ÒÀ»°ÍÀÌ´Ù.


1.2절. Å͹̳ÎÀÇ Á¾·ù

1.2.1절. Text Terminal

ÅØ½ºÆ® Å͹̳ÎÀº È£½ºÆ® ÄÄÇ»ÅÍ¿Í Åë½ÅÇϱâ À§Çؼ­ ASCII Äڵ带 ÀÌ¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ASCII ÄÚµå´Â º¸ÅëÀº Űº¸µå¸¦ ÅëÇØ¼­ ¹Ù·Î ÀÔ·ÂÀÌ °¡´ÉÇÑ ¹®ÀÚµéÀÌ¸ç ¸ð´ÏÅ͸¦ ÅëÇØ¼­ ¹Ù·Î Ãâ·ÂµÉ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ·¯ÇÑ ¹®ÀÚµé¿Ü¿¡µµ ¸î°¡Áö Á¦¾î¸¦ À§ÇÑ ¹®ÀÚ(Special control byte)µéÀÌ Á¸ÀçÇÑ´Ù. À̵é Á¦¾î¹®ÀÚ´Â Ä¿¼­À̵¿, »èÁ¦ ¿Í °°Àº ÀÔ·ÂÀ» Á¦¾îÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ·¯ÇÑ Á¦¾î¹®ÀÚ´Â ¼ö¹é°¡Áö Á¾·ù°¡ Á¸ÀçÇϰí ÀÖ´Ù. ¶ÇÇÑ °­Á¶±ÛÀÚ(bold) ¹ØÁÙ¹®ÀÚ(underline) ¿Í »ö»óº¯°æ°ú °°Àº Ãâ·Â ¸ð¾çÀÇ Á¶Á¤À» ÇÒ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ Ãâ·Â¸ð¾ç Á¶Á¤À» À§Çؼ­ ANSI ¸¦ »ç¿ëÇÑ´Ù.

À̵é ÅØ½ºÆ® Å͹̳ÎÀº ±âº»ÀûÀ¸·Î ASCII Äڵ常À» ÅëÇØ¼­ Åë½ÅÀ» Çϱ⠶§¹®¿¡, ¸Å¿ìÀú·ÅÇÏ°Ô Àü¿ëÀåÄ¡¸¦ °³¹ßÇÒ¼ö ÀÖÀ¸¸ç, ¾îÇø®ÄÉÀÌ¼Ç ¿ª½Ã ½±°Ô °³¹ß°¡´ÉÇÏ´Ù. - Á¤È®È÷ ¸»ÇÏÀÚ¸é ASCII 256 Áß¿¡ »óÀ§ 128 °³¸¸À» »ç¿ëÇÑ´Ù - 386, 286 ±Þ ÄÄÇ»ÅÍ Á¤µµ¸é ÃæºÐÈ÷ Å͹̳ΠÀåÄ¡·Î »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀ̸ç, ¸¸¾à È޴뼺ÀÌ Áß¿äÇÏ´Ù¸é ¾×Á¤µð½ºÇ÷¹À̰¡ ´Þ¸° ¸Å¿ì Á¶±×¸¶ÇÑ ½ÎÀÌÁî·Î ¸¸µé¼öµµ ÀÖÀ»°ÍÀ̸ç, ½ÇÁ¦ ¶ó¿ìÅÍ ¼¼ÆÃÀ» À§ÇÑ Àü¿ë ÀåÄ¡µéÀÌ ¾×Á¤µð½ºÇ÷¹ÀÌ¿Í Å°º¸µå¸¸À» °®Ãá ÇüÅ·Π»ç¿ëµÇ¾îÁö°í ÀÖ´Ù.


1.2.2절. Window (Terminal ?)& Thin Clients

text Å͹̳ÎÀÌ ¾Æ´Ñ°ÍÀº Thin Clients(ȤÀº À©µµ¿ì Å͹̳Î) ¶ó°í ¸»ÇÒ¼ö ÀÖ´Ù. Åë½Å¼ö´ÜÀ¸·Î ±×·¡ÇÈ Á¤º¸¸¦ »ç¿ëÇÑ´Ù. À̵é Thin Clients ÀÇ °æ¿ì Àü¼Û¹ÞÀº GUI È­¸éÀ» ºü¸¥½Ã°£¿¡ ¸ð´ÏÅÍ¿¡ »Ñ·ÁÁÙ¼ö ÀÖ¾î¾ß ÇÔÀ¸·Î ÅØ½ºÆ® Å͹̳ÎÀ» ±¸ÇöÇϱâ À§ÇÑ ÀåÄ¡º¸´Ù ´õ ºñ¿ëÀÌ ¸¹À̵ç´Ù.

¶ÇÇÑ ±×·¡ÇÈÁ¤º¸¸¦ Àü¼ÛÇØ¾ß ÇÔÀ¸·Î ÅØ½ºÆ® Å͹̳κ¸´Ù ³×Æ®¿÷ ÀÚ¿øÀ» ¸¹ÀÌ ¼Ò¸ðÇÑ´Ù.

Thin Ŭ¶óÀÌ¾ðÆ®¸¦ ÀÌ¿ë ÇÒ°æ¿ì ¸¹Àº ÀúÀå°ø°£°ú ºü¸¥ ¿¬»ê´É·ÂÀ» °¡Áø Áß¾ÓÄÄÇ»Å͸¦ ÇϳªµÎ°í, ´Ù¸¥ »ç¿ëÀÚ´Â ÀûÀº ÀúÀå°ø°£°ú »ó´ëÀûÀ¸·Î ´À¸° ¿¬»ê´É·ÂÀ» °¡Áø (Thin) ÄÄÇ»Å͸¦ µÎ¾î¼­ ½ÇÁ¦ ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇϰųª, µ¥ÀÌŸ¸¦ ÀÌ¿ëÇÒ¶§ Áß¾Ó ÄÄÇ»ÅÍ¿¡ ¿¬°áÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ´Â ÄÄÇ»ÆÃ ȯ°æÀ» ¸¸µé¼ö ÀÖÀ»°ÍÀÌ´Ù.

ÀÌ·²°æ¿ì ¿©·¯°¡Áö Áß¿ä Á¤º¸°¡ Áß¾ÓÄÄÇ»ÅÍ¿¡ ÁýÁߵǰí, ´Ù¼öÀÇ ¿¬°á »ç¿ëÀÚ ÄÄÇ»ÅÍ¿¡ ÅõÀÚÇÏ´Â ºñ¿ëÀ» ÁÙÀϼö ÀÖÀ½À¸·Î Á¤º¸°ü¸®¿Í ºñ¿ëÃø¸é¿¡¼­ ÀÌÀÍÀ» º¼¼ö ÀÖÀ»°Å¶ó°í »ý°¢µÈ´Ù. ±×·¯³ª ½ÇÁ¦·Î ÀÌ·¯ÇÑ ÄÄÇ»ÆÃ ȯ°æÀ» ¸¸µé¾î¼­ ¾²´Â °æ¿ì´Â ±×¸® ÈçÇÏÁö ¾Ê´Ù. Áö¿ª³×Æ®¿÷¿¡ °úµµÇÑ ºÎÇϸ¦ À¯¹ßÇÒ¼ö ÀÖ°í, Áß¾Ó ÄÄÇ»ÅÍ¿¡ ¹®Á¦°¡ »ý°åÀ» °æ¿ì ¸ðµç ÀÛ¾÷ÀÌ Áߴܵɼö Àֱ⠶§¹®ÀÌ´Ù. °Å±â¿¡ ÀÚ½ÅÀÇ Á¤º¸°¡ ÀÚ½ÅÀÌ Çϵ忡 ÀÖÁö ¾Ê°í Áß¾ÓÀÇ ´Ù¸¥ Çϵ忡 ÀÖ´Ù´Â °Í ÀÚü¸¦ ¸¹Àº Á÷¿øµéÀÌ ½È¾îÇÏ´Â (¹Ï¾î¿ö ÇÏÁö ¸øÇÏ´Â) °æÇâÀÌ Àֱ⠶§¹®ÀÌ´Ù.

±×·¡¼­ ÁÖ·Î ¿ø°ÝÁöÀÇ MS À©µµ¿ìÁî °è¿­ÀÇ ¼­¹ö¸¦ °ü¸®Çϱâ À§ÇÑ ¸ñÀûÀ¸·Î ¸¹ÀÌ ¾²ÀδÙ. VNC ¶óµçÁö Windows Terminal Server °¡ ÀÌ·¯ÇÑ ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù. ¸®´ª½ºÀÇ X À©µµ¿ìÀÇ °æ¿ì C/S ȯ°æÀ¸·Î ¸¸µé¾îÁ® Àֱ⠶§¹®¿¡ ±âº»ÀûÀ¸·Î Window Å͹̳ηνáÀÇ ¿ªÈ°À» ¼öÇàÇÒ¼ö ÀÖ´Ù.


2절. Å͹̳ΠÁ¦¾î

¿©±â¿¡¼­´Â ±âº»ÀûÀ¸·Î text terminal À» ±âÁØÀ¸·Î ¼³¸íÇÏ°Ô µÉ°ÍÀ̸ç, Å×½ºÆ®¸¦ Çϱâ À§ÇÑ ¿î¿µÃ¼Á¦´Â Linux (Kernel 2.4.x) °¡ µÉ°ÍÀÌ´Ù. ¶ÇÇÑ ½Ã¸®¾óÅë½ÅÀ» À§ÇÑ terminal ȯ°æ°ú °°Àº °ÍµéÀº ´Ù·çÁö ¾ÊÀ»°ÍÀÌ´Ù. À̹®¼­¿¡¼­´Â PC¿¡¼­ °¡Àå ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â Űº¸µå+¸ð´ÏÅÍ (/dev/tty) ¿¡ ´ëÇØ¼­¸¸ ´Ù·ê°ÍÀÌ´Ù. ½Ã¸®¾óÅë½Å°ú °°Àº Ư¼ö? ÇѰ͵éÀº ¿ª½Ã(-.-;) ±âȸ°¡ µÈ´Ù¸é(¾ðÁ¨°¡) ´Ù·çµµ·Ï ÇϰڴÙ.


2.1절. Å͹̳ΠÁ¦¾î°¡ ¿Ö ÇÊ¿äÇѰ¡ ?

±âº»ÀûÀ¸·Î »ç¿ëÀÚ´Â ÄÄÇ»ÅÍȤÀº ¿©·¯°¡Áö ÁÖº¯ÀåÄ¡¿Í ´ëÈ­ÇÒ¶§ Å͹̳ÎÀ» ÀÌ¿ëÇØ¼­ ´ëÈ­ÇÏ°Ô µÈ´Ù. º¸Åë ¿ì¸®°¡ ÄÄÇ»ÅÍ ¸ð´ÏÅÍ ¾Õ¿¡ ¾É¾Æ¼­ ÀÛ¾÷À» ÇÒ¶§´Â Ç¥ÁØ Å͹̳ÎÀåÄ¡ÀÎ /dev/tty ¸¦ ÅëÇØ¼­ ÄÄÇ»ÅÍ¿Í ´ëÈ­¸¦ ÇϰÚÁö¸¸ ¶§¶§·Î Á÷·Ä(serial)Æ÷Æ®¸¦ ÅëÇØ¼­ ÄÄÇ»ÅÍ¿Í ´ëÈ­¸¦ ÇØ¾ßÇÏ´Â °æ¿ìµµ »ý±æ°ÍÀÌ´Ù. À̵é Á÷·ÄÆ÷Æ®¿Í Åë½ÅÇϱâ À§Çؼ­´Â /dev/ttyS0 °ú °°Àº ÀåÄ¡ÆÄÀÏ µéÀ» ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÏ°Ô µÇ´Âµ¥, À̰æ¿ì ȸ¼±¼Óµµ¸¦ ¼­·Î ¸ÂÃß¾îÁà¾ß Çϸç, ¿©·¯°¡Áö À̽ºÄÉÀÌÇÁ¹®ÀÚ(Ctrl+C ¿Í °°Àº)¿¡ ´ëÇÑ Ã³¸®µîÀ» ÇØÁÖ¾î¾ß ÇÔÀ¸·Î ÅÍ¹Ì³ÎÆ¯¼º º¯°æµîÀÇ ÀÛ¾÷À» ÇØÁÖ¾î¾ß ÇÑ´Ù. - ÀÌ ¹®¼­¿¡¼­´Â ½Ã¸®¾ó Åë½Å°ú °ü·ÃµÈ ÁÖÁ¦´Â ´Ù·çÁö ¾ÊÀ»°ÍÀÌ´Ù. -

±×¸®°í /dev/tty ¸¦ ÅëÇØ¼­ ÀÛ¾÷À» ÇϰíÀÚ ÇÒ¶§µµ Űº¸µå ÀÔ·ÂÀ» ¹ÝÇâ(echo) ½ÃÄÑ¾ß ÇÒ°ÍÀÎÁö, Ư¼ö¹®ÀÚÀԷ¿¡ ´ëÇÑ Á¤Ã¥¼öÁ¤, ij¸®Áö¸®ÅÏÀ» ¹Þ¾Æµé¿©¾ß ÇÒ°ÍÀÎÁö, Ctrl+d, Ctrl+c ¿Í °°Àº Á¦¾î¹®ÀÚ¸¦ ¹Þ¾ÆµéÀϰÍÀÎÁö ¹«½ÃÇÒ°ÍÀÎÁö µî Çʿ信 µû¶ó¼­ Å͹̳ÎÀÇ Æ¯¼ºÀ» º¯°æ½ÃÄÑÁà¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. °¡Àå °£´ÜÇÑ ¿¹·Î ¾ÆÀ̵ð¿Í ÆÐ½º¿öµå¸¦ ÀԷ¹޴ Å͹̳αâ¹ÝÀÇ ÇÁ·Î±×·¥À» ¸¸µé¾î¾ß ÇÑ´Ù°í ÇßÀ»¶§, ÆÐ½º¿öµå ÀԷ½ÿ¡´Â Űº¸µå·Î ÀԷµǴ ¹®ÀÚ°¡ ¸ð´ÏÅÍ¿¡ ¹Ù·Î Ãâ·ÂµÇ°Ô ÇÏ¸é ¾ÈµÉ°ÍÀÌ´Ù. ÀÌ·²°æ¿ì´Â Å͹̳ÎÀÇ Æ¯¼ºÀ» º¯°æ½ÃÄѼ­ Űº¸µåÀÔ·ÂÀÌ È­¸é¿¡ ¹ÝÇâ(echo)µÇÁö ¾Êµµ·Ï ÇØÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ.

¿¹Á¦ : echo_off.c
#include <stdlib.h>
#include <stdio.h>

#include <termios.h>
#include <string.h>

static struct termios stored_settings;
void echo_off(void)
{
    struct termios new_settings;
    tcgetattr(0, &stored_settings);
    new_settings = stored_settings;
    new_settings.c_lflag &= (~ECHO);
    new_settings.c_lflag &= (~ICANON);
    tcsetattr(0,TCSANOW, &new_settings);

    return ;
}

void echo_on(void)
{
    tcsetattr(0, TCSANOW, &stored_settings);
    return ;
}

void get_pass(char *pass)
{
    char buf;
    int i=0;

    printf("Passwd : ");
    echo_off();
    while ((buf=getc(stdin)) != '\n')
    {
        pass[i] = buf;
        printf("%s", "*");
        i ++;
    }
    echo_on();
}

int main()
{
    char pass[16];
    memset(pass, 0x00, 16);
    get_pass(pass);
    printf("\nYour input : %s\n", pass);
    return 1;
}
			
À§ÀÇ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ ÆÐ½º¿öµå¸¦ ÀԷ¹޴ ÀÏÀ»ÇÑ´Ù. ÆÐ½º¿öµåÀÇ °æ¿ì È­¸é¿¡ ¹Ù·Î Ãâ·ÂµÇ¸é ¾ÈµÊÀ¸·Î, Å͹̳ÎÀÇ ¶óÀÎ Ãâ·Â Ư¼ºÀ» "¹ÝÇâ ²û" À¸·Î ¼³Á¤Çϰí ŰÀÔ·ÂÀ» ¹Þ¾ÆµéÀ̵µ·Ï Çß´Ù. ±×¸®°í »ç¿ëÀÚ Å°ÀÔ·ÂÀ» "*" ·Î ´ëü ½ÃÄѼ­ È­¸é¿¡ Ãâ·ÂÇϵµ·Ï ÇØ¼­ »ç¿ëÀÚ ÆÐ½º¿öµå¸¦ ÀÔ·Â ¹Þµµ·Ï ¸¸µé¾ú´Ù.


2.2절. Å͹̳ΠÀåÄ¡ ÆÄÀÏ(tty)

°¢°¢ÀÇ Å͹̳ÎÀº ÀÚ½ÅÀÌ »ç¿ëÇÏ´Â ÀåÄ¡ÆÄÀÏ¿¡ ¿¬°áÇØ¼­ Åë½ÅÀ» ÇÏ°Ô µÈ´Ù. ¿¹¸¦µé¾î com1 Æ÷Æ®¿Í ½Ã¸®¾ó Åë½ÅÀ» ÇØ¾ß ÇÑ´Ù¸é /dev/ttyS0 °ú ¿¬°áÀ» ÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê°í ÀϹÝÀûÀÎ °³ÀÎ PC ÀÇ Ç¥ÁØÅ͹̳ÎÀΠŰº¸µå&¸ð´ÏÅÍ ¿Í Åë½ÅÇϱ⸦ ¿øÇÑ´Ù¸é /dev/tty0 °ú°°Àº ÀåÄ¡ÆÄÀϰú ¿¬°áÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀåÄ¡ÆÄÀÏÀº ASCII ÄÚµåÁß È­¸é¿¡ Ç¥½ÃµÇ´Â ¹®ÀÚ(chricter)¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÏ°Ô µÊÀ¸·Î ij¸¯ÅÍ µð¹ÙÀ̽º ÆÄÀÏ(¹®ÀÚ ÀåÄ¡ÆÄÀÏ) À̶ó°í ºÎ¸¥´Ù. ls -al ·Î À§ÀÇ ÆÄÀÏÀÇ Á¤º¸¸¦ ¾Ë¾Æº¸¸é ¾Æ·¡¿Í °°À»°ÍÀÌ´Ù.
[root@localhost /dev]# ls -al /dev/tty*	
crw-rw-rw-    1 root     root       5,   0 10¿ù 12  2001 /dev/tty
crw--w----    1 root     root       4,   0 12¿ù  1 12:21 /dev/tty0
crw--w----    1 root     tty        4,   1 12¿ù  1 12:21 /dev/tty1
crw--w----    1 root     root       4,  10 10¿ù 12  2001 /dev/tty10
crw--w----    1 root     root       4,  11 10¿ù 12  2001 /dev/tty11
crw--w----    1 root     root       4,  12 10¿ù 12  2001 /dev/tty12
crw--w----    1 root     root       4,  13 10¿ù 12  2001 /dev/tty13
...
			
ÆÄÀÏ ¸®½ºÆ®ÀÇ °¡Àå¾Õ¿¡ ÀÖ´Â 'c' °¡ ij¸¯ÅÍ µð¹ÙÀ̽º ÆÄÀÏÀÓÀ» ³ªÅ¸³»Áִ ǥ½ÃÀÌ´Ù.

ÀÌ·¯ÇÑ ÀåÄ¡ÆÄÀÏ¿¡¿¡ Á¢±ÙÇØ¼­ ¿øÇÏ´Â ÀåÄ¡¿Í Åë½ÅÇÏ´Â ¹æ¹ýÀº ÀǿܷΠ°£´ÜÇÏ´Ù. ÀÏ¹ÝÆÄÀϰú ¸¶Âù°¡Áö·Î open ÇÑ´ÙÀ½¿¡ read, write ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ Á¤º¸¸¦ ÀÐ°í ¾²¸é µÈ´Ù.
    | <-- APP °³¹ßÀÚ¿µ¿ª --> | <-- µð¹ÙÀ̽º µå¶óÀ̹ö °³¹ßÀÚ¿µ¿ª --> |
  +-----+     +-----------+     +------------+    +---------------+    +------+ 
  | APP | --- | open(2)   | --- | /dev/ttyS0 | -- | device driver | -- | ÀåÄ¡ |   
  +-----+     | read(2)   |     +------------+    +---------------+    +------+
              | write(2)  |    
              +-----------+    
			
À§ÀÇ ±×¸²Àº ÀÏ¹Ý ¾îÇø®ÄÉÀ̼ǿ¡¼­ ¾î¶»°Ô ÀåÄ¡¿Í Åë½ÅÇÒ¼ö ÀÖ´ÂÁö¿¡ ´ëÇÑ °è·«ÀûÀÎ ¸ð¾çÀ» ³ªÅ¸³½ ±×¸²ÀÌ´Ù. ÀåÄ¡´Â Űº¸µå°¡ µÉ¼öµµ ÀÖÀ»°ÍÀ̸ç, ¶§¿¡ µû¶ó¼­´Â COM,USB Æ÷Æ®°¡ µÉ¼öµµ ÀÖÀ»°ÍÀÌ´Ù. ¸¹ÀÌ ¾Ë·ÁÁ® ÀÖ´Â ´ëºÎºÐÀÇ ÀåÄ¡ µð¹ÙÀ̽º µå¶óÀ̹ö´Â ÀÌ¹Ì Á¦À۵Ǿî ÀÖÀ½À¸·Î ÀÏ¹Ý ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¡¸Ó¶ó¸é open, read, write ¸¦ ÀÌ¿ëÇØ¼­ ÀåÄ¡¿Í Åë½ÅÇÏ´Â ºÎºÐ±îÁö¸¸ ½Å°æ¾²¸é µÈ´Ù. ±×·¯³ª ¾Ë·ÁÁ® ÀÖÁö ¾ÊÀº ÀåÄ¡¸¦ ÄÄÇ»ÅÍ¿¡ ¿¬°áÇØ¼­ »ç¿ëÇØ¾ß ÇÒ°æ¿ì¿¡´Â Á÷Á¢ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Á¦ÀÛÇØ¾ß ÇÒ°ÍÀÌ´Ù.

Barcode ¸®´õ±â·Î ºÎÅÍ ÀоîµéÀÎ µ¥ÀÌŸ¸¦ ó¸®ÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µé°íÀÚ ÇÑ´Ù¸é, (com1 Æ÷Æ®¸¦ »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏÀÚ), ¾îÇø®ÄÉÀÌ¼Ç Á¦ÀÛÀÚ´Â ´ÜÁö /dev/ttyS0 À» open ÇÑ´ÙÀ½¿¡ read ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÐÀ» µ¥ÀÌŸ°¡ ÀÖ´ÂÁö °Ë»çÇϰí, µ¥ÀÌŸ°¡ µé¾î¿À¸é À̰ÍÀ» Àû´çÇÏ°Ô Ã³¸®Çϵµ·Ï ÇØÁÖ¸é µÈ´Ù. ¹°·Ð ³»ºÎÀûÀ¸·Ð ¸î°¡Áö ´Ù¸¥ ÀϵéÀ» ÇØÁà¾ß °ÚÁö¸¸, °³³äÀûÀ¸·Î º¸ÀÚ¸é ¸Å¿ì °£´ÜÇÏ°Ô ±¸Çö°¡´ÉÇÔÀ» ¾Ë¼ö ÀÖ´Ù.


2.3절. termios ÇÔ¼ö¸¦ ÅëÇÑ Å͹̳ÎÁ¦¾î

À¯´Ð½º¿¡¼­´Â ÀÌ·¯ÇÑ Å͹̳ÎÁ¦¾î¸¦ À§Çؼ­ termios ¶ó´Â ÇÔ¼ö¸ðÀ½À» Á¦°øÇÑ´Ù. ¿ì¸®´Â ÀÌ ÇÔ¼öµéÀ» ÅëÇØ¼­ Å͹̳ÎÀ» ¿øÇÏ´Â ¹æÇâÀ¸·Î Á¦¾îÇÒ¼ö ÀÖ°Ô µÈ´Ù. À̹øÀå¿¡¼­´Â termios ÇÔ¼öµé¿¡ ´ëÇÑ ¼³¸í°ú À̸¦ ÀÌ¿ëÇÑ Å͹̳ÎÁ¦¾îÀÇ ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

±âº»ÀûÀ¸·Î termios ´Â µð¹ÙÀ̽º(ÀåÄ¡)¿ÍÀÇ asynchronous(ºñµ¿±â) Åë½ÅÀ» À§ÇÑ ÇÁ·Î±×·¡¹Ö ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù.


2.3.1절. Å͹̳Π±âº»¸ðµå

Å͹̳ÎÀº Å©°Ô 2°¡Áö ¸ðµåÀÎ "Á¤±Ô¸ðµå"¿Í "ºñÁ¤±Ô¸ðµå" ·Î ³ª´¶´Ù. À̰͵éÀº Å͹̳ÎÀ» Á¦¾îÇϴµ¥ ¸Å¿ì Áß¿äÇÑ ¿ä¼ÒÀÓÀ¸·Î º°µµÀÇ ÀåÀ» ¸¸µé¾î¼­ ¼³¸íÀ» Çß´Ù.


2.3.1.1절. Canonical Mode Input Processing

ÈçÈ÷ Á¤±Ô¸ðµå¶ó°í ÇÏ¸ç ±âº»ÀûÀ¸·Î ¶óÀδÜÀ§·Î ÀÔÃâ·ÂÀ» ó¸®ÇÏ°Ô µÈ´Ù. ¿©±â¿¡¼­ ¸»ÇÏ´Â ¶óÀÎÀÇ °³³äÀº ¿ì¸®µéÀÌ ¿¡µðÅÍ¿¡¼­ ÀÛ¾÷ÇÒ¶§ÀÇ ¶óÀΰú °°Àº °³³äÀ¸·Î '\n' ȤÀº EOF(End-Of-File) ¸¦ ¸¸³¯¶§±îÁöÀÇ ¹®ÀÚ¿­À» ¸»ÇÑ´Ù. º¸Åë »ç¿ëÀÚ¿Í ÄÄÇ»ÅÍ¿Í ´ëÈ­Çϱâ À§ÇÑ ÀÔÃâ·ÂÀº Á¤±Ô¸ðµå »óÅ¿¡¼­ ÇàÇØÁø´Ù. ÀÌ»óÅ¿¡¼­´Â ¹®ÀÚ¿­ ÀÔ·ÂÈÄ Enter ۸¦ ´­·¯¾ß ¸®ÅÏÀÌ µÉ°ÍÀÌ´Ù. (ȤÀº Ctrl+d ¸¦ ´­·¯¼­ EOF ¸¦ ¹ß»ý½Ãų°æ¿ì)

¶ÇÇÑ Á¤±Ô ¹æ½Ä¿¡¼­´Â ERASE¿Í KILL ¹®ÀÚµîÀÌ Çã¿ëµÈ´Ù. Á¤±Ô¹æ½Ä ÀÚü°¡ ¶óÀδÜÀ§ ÀÔÃâ·ÂÀÛµ¿ÀÓÀ¸·Î ´ç¿¬È÷ Erase, kill ¹®ÀÚ¸¦ »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.

±âº»ÀûÀ¸·Î Å͹̳ÎÀº Á¤±Ô¸ðµå·Î ½ÃÀÛÇÑ´Ù.


2.3.1.2절. NonCanonical Mode Input Processing

ºñÁ¤±Ô¸ðµå¶ó°í ÇÑ´Ù. Á¤±Ô¸ðµå°¡ ¶óÀδÜÀ§·Î ÀÔÃâ·ÂÀ» ó¸®ÇÏ´Â °Í°ú ´Þ¸® ºñÁ¤±Ô¸ðµå´Â ÇѹÙÀÌÆ®¾¿ ó¸®ÇÏ°Ô µÈ´Ù. ÇѹÙÀÌÆ®¾¿ ó¸®ÇÏ°Ô µÊÀ¸·Î Á¤±Ô¸ðµå¿¡¼­ °¡´ÉÇß´ø ¿©·¯°¡Áö Ư¼ö¹®ÀÚµé(ERASE, KILL, EOF, NL, CR)À» »ç¿ëÇÒ¼ö ¾ø°Ô µÈ´Ù. - ´ç¿¬ÇÏ´Ù ÀÌ¹Ì µ¹·ÁÁø ¹®ÀÚ¿¡ ´ëÇØ¼­ ERASE µîÀ» ÇÒ¼ö ÀÖÀ» ÅÎÀÌ ¾ø´Ù -

¿¹Á¦ echo_off.c °¡ ºñÁ¤±Ô¸ðµå·Î ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥Àε¥, delete ۵îÀÌ ¸ÔÁö ¾ÊÀ½À» ¾Ë¼ö ÀÖ´Ù. À§¿¡¼­ ¸»ÇßµíÀÌ ºñÁ¤±Ô¸ðµå¿¡¼­´Â ERASE ¹®ÀÚ°¡ »ç¿ëµÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù. echo_off.c ¸¦ ºñÁ¤±Ô ¸ðµå·Î ÀÛ¼ºÇÑ ÀÌÀ¯´Â Á¤±Ô¸ðµå·Î ÇÒ°æ¿ì °³Ç๮ÀÚ '\n' ÀÌ ÀԷµDZâ Àü±îÁö´Â ¸®ÅϵÇÁö ¾ÊÀ½À¸·Î ¹ÙÀÌÆ®´ÜÀ§·Î ¸®ÅÏÇϵµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù. À§ ¿¹Á¦Äڵ忡¼­ new_settings.c_lflag &= (~ICANON); À» ÁÖ¼®Ã³¸® ÇÑ´ÙÀ½¿¡ ½ÇÇà½ÃŰ¸é ¿£ÅÍ۸¦ ÀÔ·ÂÇϱâ Àü±îÁö´Â È­¸é¿¡ "*" ÀÌ Ãâ·ÂµÇÁö ¾ÊÀ½À» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ´ë½Å Delete ¿Í °°Àº ¸î¸î Ư¼ö¹®ÀÚÀÇ Àü´ÞÀÌ °¡´ÉÇÔÀ» ¾Ë¼ö ÀÖ´Ù.


2.3.2절. termios ±¸Á¶Ã¼ - Å͹̳Π¼Ó¼º±¸Á¶Ã¼

¸ðµç Å͹̳Πµ¥ÀÌŸ´Â ´ÙÀ½ÀÇ termios ±¸Á¶Ã¼ÀÇ °¢ Ç÷¹±×ÀÇ ºñÆ®°ªÀ» Àоî¿À°Å³ª ºñÆ®°ªÀ» ¼¼ÆÃÇØÁÜÀ¸·Î½á °Ë»ç¿Í ¼³Á¤À» ÇÒ¼ö ÀÖ´Ù.
struct 
{
    tcflag_t c_iflag;  /* input modes */
    tcflag_t c_oflag;  /* coutput modes */
    tcflag_t c_cflag;  /* contrl modes */
    tcflag_t c_lflag;  /* local flag */ 
    cc_t     c_cc[NCCS];
}
				
c_inflag ´Â ¸»±×´ë·Î ÀԷ°ú °ü·ÃµÇ¾î¼­ Å͹̳Π¼Ó¼ºÀ» º¯°æÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. c_oflag ´Â Ãâ·Â°ú °ü·ÃµÈ ¼Ó¼ºº¯°æÀ» ó¸®È÷°¡ À§Çؼ­, c_cflag ´Â Á÷·Ä(½Ã¸®¾ó)Åë½Å°ú °ü·ÃµÈ Å͹̳Π¼Ó¼ºº¯°æÀ» À§Çؼ­ »ç¿ëµÈ´Ù. ¸¶Áö¸· c_lflag ´Â ½ÇÁ¦ »ç¿ëÀÚ¿¡°Ô º¸¿©Áö´Â Å͹̳ÎÀÇ ¼Ó¼º Áï Ãâ·ÂÀÇ ¹ÝÇâ(ECHO)¸¦ on/off, Ư¼öÀԷ¹®ÀÚµé(Ctrl+C ¿Í °°Àº)ÀÇ ¼Ó¼º Á¦¾î¸¦ Á¦¾îÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.

´ÙÀ½Àº °¢°¢ÀÇ Ç÷¡±×¸¦ ÅëÇØ¼­ ¼³Á¤ÇÒ¼ö ÀÖ´Â Å͹̳ÎÀÇ ¼Ó¼ºµéÀÌ´Ù. ¾Æ¸¶ º°·Î »ç¿ëÇÏÁö ¾Ê´Â ¸î°¡Áö Á¤µµ´Â ºüÁ³À»¼öµµ ÀÖÀ½À¸·Î ÀÚ¼¼ÇÑ ¸ðµç Å͹̳Π¼Ó¼ºÁ¤º¸¸¦ ¾Ë°í ½Í´Ù¸é termios ÀÇ man ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

표 1. Å͹̳Π¼Ó¼º°ª - c_iflag

¼³¸íÅ͹̳ΠÀԷ°ú °ü·ÃµÈ Á¦¾î¸¦ ÇÑ´Ù. ÀÔ·ÂÁ¦¾î °ªµéÀº ¸ðµå on µÇ¾îÀÖ´Â »óÅÂÀÌ´Ù.
IGNBRKbreak ÄÁµð¼ÇÀ» ¹«½ÃÇÑ´Ù. break ÄÁµð¼ÇÀº ¿¬¼ÓµÈ 0ÀÇ °ªÀ» °¡Áö´Â ºñÆ®·Î Á¤ÀǵȴÙ. ¸¸¾à IGNBRK °¡ on µÇ¾î ÀÖ°í ÀԷµ¥ÀÌŸ¿¡ break ÄÁµð¼ÇÀÌ Àü´ÞµÈ´Ù¸é ¹«½ÃÇÏ°Ô µÈ´Ù.
BRKINTÀ̰ÍÀº break ÄÁµð¼Ç »ó¿¡¼­ SIGINT ¸¦ °¡·Îä±â À§Çؼ­ »ç¿ëµÈ´Ù. ¸¸¾à IGNBRK °¡ off µÇ¾îÀÖ°í, BRKINT°¡ ¼¼ÆÃµÇ¾î ÀÖ´Â »óÅ¿¡¼­ break ÄÁµð¼ÇÀÌ ÀԷµȴٸé À̰ÍÀº Ãâ·ÂÄí¿¡ ½×ÀÌ°Ô µÈ´Ù. ¸¸¾à Å͹̳ÎÀÌ foreground process »óÅ·Πµ¹°í ÀÖ´Â µµÁßÀ̶ó¸é, SIGINT ½ÅÈ£¸¦ ¹ß»ý½ÃŰ°Ô µÈ´Ù.
IGNPARparity ¿¡·¯¹«½ÃÇÑ´Ù.
INPCKparity üũ¸¦ ½Ç½ÃÇÑ´Ù.
ISTRIP¸¸¾à ÀÌ Ç÷¹±×¸¦ on ½Ã۸é, À¯È¿ÇÑ ÀÔ·Â ¹®ÀÚ¸¦ óÀ½ 7bit ·Î ¼¼ÆÃÇÏ°Ô µÈ´Ù. ±×·¸Áö ¾ÊÀ»°æ¿ì 8bit ÀÔ·ÂÀ¸·Î ó¸®ÇÑ´Ù.
INLCRNL ¹®ÀÚ(new-line)¸¦ CR(carriage return) ¹®ÀÚ·Î ´ëü½ÃŲ´Ù. ¸¸¾à ÀÌ Ç÷¹±×°¡ on µÈ´Ù¸é, NL ¹®ÀÚ´Â CR ¹®ÀÚ·Î º¯°æµÈ´Ù.
IGNCRCR ¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù. on µÉ°æ¿ì ÀԷµǴ CR ¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù. (ÀÐÁö ¾Ê´Â´Ù)
ICRNLCR ¹®ÀÚ¸¦ NL ¹®ÀÚ·Î ´ëü½ÃŲ´Ù. IGNCR ÀÌ on µÇ¾î ÀÖÁö ¾ÊÀº »óÅ¿¡¼­ ICRNLÀÌ on µÇ¾î ÀÖÀ»°æ¿ì ¹ÞÀº CR À» NL ·Î º¯°æÇÑ´Ù.
IXONstart ¿Í stop Ãâ·ÂÁ¦¾î¸¦ Ȱ¼ºÈ­ ÇÑ´Ù. ¸¸¾à Ç÷¹±×°¡ on ÀÎ »óÅ¿¡¼­ STOP ij¸¯Å͸¦ ¹Þ¾Ò´Ù¸é Ãâ·ÂÀ» ¸ØÃß°Ô µÈ´Ù. ±×·¯´Ù°¡ START ij¸¯Å͸¦ ¹Þ°Ô µÇ¸é ´Ù½Ã Ãâ·ÂÀ» ½ÃÀÛÇÏ°Ô µÈ´Ù. À̰ÍÀº flow-control(È帧Á¦¾î)¸¦ À§ÇÑ ¿ëµµ·Î »ç¿ëµÇ¸ç, ½ÇÁ¦ STOP, START ij¸¯Å͸¦ ÀоîµéÀÌÁö´Â ¾Ê´Â´Ù. ¸¸¾à Ç÷¹±×°¡ off »óŶó¸é STOP, START ij¸¯Å͸¦ ÀоîµéÀδÙ.
IXOFFÀÔ·ÂÁ¦¾î¸¦ À§Çؼ­ start ¿Í stop ¸¦ Ȱ¼ºÈ­ ÇÑ´Ù. ¸¸¾à¿¡ Ç÷¹±×°¡ on À¸·Î µÇ¾îÀÖ´Ù¸é ½Ã½ºÅÛÀº ÀÔ·ÂÅ¥°¡ °¡µæ áÀ»¶§ STOP ij¸¯Å͸¦ Àü¼ÛÇÑ´Ù. ±×¸®°í³ª¼­ ÀÔ·ÂÅ¥¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ ¸ðµÎ Àоú´Ù¸é START ij¸¯Å͸¦ Àü¼ÛÇÑ´Ù. IXON°ú ÇÔ²² È帧Á¦¾î¸¦ À§Çؼ­ »ç¿ëµÈ´Ù.
IXANY¾î¶² ¹®ÀÚ¿¡ ´ëÇØ¼­¶óµµ Ãâ·ÂÀ» ÇÑ´Ù. ÀÌ Ç÷¹±×°¡ on À̶ó¸é ÀÔ·ÂµÈ ¾î¶² ¹®ÀÚ¶óµµ Ãâ·ÂÀ» ½ÃÀÛ ÇÏ°Ô µÈ´Ù.
IMAXBEL¸¸¾à ÀԷ½ºÆ®¸²ÀÌ overflows µÉ°æ¿ì ASCII BEL À» ¹ÝÇâÇÑ´Ù.

표 2. Å͹̳Π¼Ó¼º°ª - c_iflag

¼³¸íÃâ·ÂÀ» ¾î¶»°Ô ´Ù·êÁö¿¡ °üÇÑ ¼³Á¤À»ÇÑ´Ù. ±âº»¼³Á¤Àº ¸ðµç ºñÆ®¿¡ ´ëÇØ¼­ on(1) ÀÇ »óÅÂÀÌ´Ù.
  
OPOSTPost-process output ¸ðµå. ¸¸¾à ÀÌ Ç÷¹±×°¡ off »óŶó¸é ¹®ÀÚ´Â º¯È­¾øÀÌ Àü´ÞµÈ´Ù. ±×·¸Áö ¾Ê°í on À̶ó¸é, µÚ¿¡ ¿À´Â flag ¿¡ ÀÇÇØ¼­ º¯°æµÉ¼ö ÀÖ´Ù.
OLCUCÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖÀ»°æ¿ì ¿µ¹®¼Ò¹®ÀÚ ´Â ¿µ¹®´ë¹®ÀڷΠġȯµÇ¾î¼­ Àü´ÞµÈ´Ù.
ONLCRÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖÀ»°æ¿ì NL ¹®ÀÚ´Â CR-NL ¹®ÀڷΠġȯµÇ¾î¼­ Àü´ÞµÈ´Ù.
OCRNLÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é CR ¹®ÀÚ´Â NL ¹®ÀڷΠġȯµÈ´Ù.
ONOCRÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é CRÀÌ ¾Æ´Ñ ù¹øÂ° ¹®ÀÚºÎÅÍ Àü´ÞµÇ°Ô µÈ´Ù.
OFILL½Ã°£Áö¿¬À» À§Çؼ­ fill ¹®ÀÚ¸¦ ÀÌ¿ëÇÑ´Ù. ÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é, ¹®ÀÚ Àü´Þ½Ã°£Áö¿¬À» À§Çؼ­ time Áö¿¬À» »ç¿ëÇÏÁö ¾Ê°í fill ¹®ÀÚ¸¦ Àü´ÞÇÏ´Â °ÍÀ¸·Î ´ë½ÅÇÑ´Ù.
OFDELÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é fill ¹®ÀÚ·Î DELÀÌ Àü´ÞµÈ´Ù.
NLDLYnew-line ¹®ÀÚÁö¿¬ÀÌ´Ù. NL0 °ú NL1 µÎ°³ÀÇ °ªÀÌ ÁغñµÇ¾î ÀÖ´Ù. NL0 Àº Áö¿¬¾øÀ½À̸ç, NL1 ÀÇ °æ¿ì ¾à 0.1 ÃÊ Á¤µµÀÇ Áö¿¬½Ã°£ÀÌ »ý±ä´Ù. ¸¸¾à OFILL Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é, Áö¿¬À» ¸¸µé±â À§Çؼ­ µÎ°³ÀÇ fill ¹®ÀÚ¸¦ Àü´ÞÇÑ´Ù.
CRDLYCR ¹®ÀÚÁö¿¬ÀÌ´Ù. ¿©±â¿¡´Â CR0, CR1, CR2, CR3 ÀÇ °ªÀÌ ÁغñµÇ¾î ÀÖ´Ù. CR0 Àº Áö¿¬¾øÀ½, CR1 Àº Ä÷³À§Ä¡¿¡ µû¶ó Áö¿¬½Ã°£ °áÁ¤, CR2 ´Â ¾à 0.10 ÃÊ, CR3 ´Â ¾à 0.15ÃÊÀÇ Áö¿¬ÀÌ »ý±ä´Ù.
TABDLY¼öÆòÅÇ ½Ã°£Áö¿¬ÀÌ´Ù. TAB0, TAB1, TAB2, TAB3 ÀÇ °ªÀÌ ÁغñµÇ¾î ÀÖ´Ù. TAB0Àº Áö¿¬¾øÀ½, TAB1 Àº Ä÷³À§Ä¡¿¡ µû¶ó Áö¿¬½Ã°£ °áÁ¤, TAB2 ´Â 0.1Ãʰ¡·®ÀÇ Áö¿¬µÈ´Ù. TAB3 ·ÎÇßÀ»°æ¿ì ÅÇÀº ½ºÆäÀ̽º·Î È®ÀåµÈ´Ù.
BSDLY¹é½ºÆäÀ̽ºÅ° ½Ã°£Áö¿¬ÀÌ´Ù. BS0°ú BS1 ÀÌ ÁغñµÇ¾î ÀÖÀ¸¸ç, BS0Àº Áö¿¬¾øÀ½, BS1 Àº ¾à 0.05 ÀÇ ½Ã°£Áö¿¬À» ³ªÅ¸³½´Ù. OFILL Ç÷¹±×°¡ ¼¼ÆÃµÇ¾î ÀÖÀ¸¸ç BS1 À̶ó¸é ÇѰ³ÀÇ fill ¹®ÀÚ¸¦ º¸³½´Ù.

표 3. Å͹̳Π¼Ó¼º°ª - c_cflag

¼³¸íÇϵå¿þ¾îÀÇ Å͹̳ÎÁ¦¾î¿¡ °ü·ÃµÈ ¼Ó¼ºµéÀÌ´Ù. ¸ðµ©°ú °°Àº Çϵå¿þ¾î Á¦¾î¿¡ ¸¹ÀÌ ¾²ÀδÙ.
CBAUDbaud rate ¿¡ ´ëÇÑ ¼³Á¤ÀÌ´Ù. Çϵå¿þ¾î¿¡ µû¶ó¼­ ¼ÓµµÀÇ º¯È­°¡ ºÒ°¡´ÉÇѰæ¿ìµµ ÀÖ´Ù. ¸ðµ©À» »ç¿ëÇØº»ÀûÀÌ ÀÖ´Ù¸é baud rate ¿¡ ´ëÇØ¼­ ÀÚÁÖ µé¾îº¸¾ÒÀ»°ÍÀÌ´Ù. ÀÚÁÖ »ç¿ëµÇ´Â baud rate ´Â B4800, B9600, B19200, B38400 À¸·Î °¢¼ýÀÚ°¡ baud ¼Óµµ¸¦ ³ªÅ¸³½´Ù. Âü°í·Î baud ´Â Çϵå¿þ¾îÀÇ µ¥ÀÌŸ ó¸® ¼Óµµ¸¦ ³ªÅ¸³½´Ù. À̿ܿ¡ B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400 ÀÌ ÀÖ´Ù. ¸¶Âù°¡Áö·Î B ´ÙÀ½ÀÇ ¼ýÀÚ°¡ baud ¼ÓµµÀÌ´Ù.
CSIZE¹®ÀÚÀÇ Å©±â¸¦ ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. CS5, CS6, CS7, CS8 ÀÌ ÁغñµÇ¾î ÀÖÀ¸¸ç, °¢°¢ 5, 6, 7, 8bit ¸¦ ³ªÅ¸³½´Ù.
CSTOPBstop ºñÆ®ÀÇ ¼ö¸¦ Á¤ÇÑ´Ù. ÀÌ Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é 2°³ÀÇ stop ºñÆ®¸¦ ±×·¸Áö ¾Ê´Ù¸é 1°³ÀÇ stop ºñÆ®¸¦ º¸³½´Ù.
CREADreceiver À» Ȱ¼ºÈ­ÇÑ´Ù.
HUPCLÀÌ Ç÷¹±×°¡ ¼¼ÆÃµÇ¾î ÀÖ´Ù¸é, ¸¶Áö¸· ÇÁ·Î¼¼½º°¡ Á¾·áµÇ°Å³ª, ¸¶Áö¸· ÇÁ·Î¼¼½ºÀÇ line(ȸ¼±)ÀÌ ´ÝÈú°æ¿ì disconnect °¡ ¹ß»ýÇÑ´Ù.
PARENBparity ¸¦ Ãß°¡ÇÑ´Ù. ÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖÀ¸¸é, parity ¸¦ »ý¼ºÇÏ°í °Ë»öÇÏ°Ô µÈ´Ù. °¢¹®ÀÚ¿¡ parity bit °¡ Ãß°¡µÈ´Ù.

표 4. Å͹̳Π¼Ó¼º°ª - c_lflag

¼³¸í·ÎÄÃ(»ç¿ëÀÚ) Å͹̳ο¡ °üÇÑ ¼Ó¼º°ú °ü·ÃµÇ¾î ÀÖ´Ù. ÃʱⰪÀº ¸ðµÎ on »óÅÂÀÌ´Ù.
ISIGsignal À» ¹Þ¾ÆµéÀδÙ. ÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é, INTR, QUIT, SUSP, DSUSP °ú °°Àº Ư¼ö ¹®ÀÚ¸¦ ¹Þ¾ÆµéÀδÙ.
ICANONÀÌ Ç÷¹±×°¡ onµÇ¸é Á¤±Ô¸ðµå·Î ÀÔ·ÂÀÌ ÀÌ·ç¾îÁø´Ù.
NOFLSHqueue flush ¸¦ ºñȰ¼ºÈ­ ½ÃŲ´Ù.
ECHO¹ÝÇâÀ» ¼³Á¤ÇÑ´Ù. ¸¸¾à ÀÌ Ç÷¹±×°¡ off µÇ¾îÀÖ´Ù¸é ÀÔ·ÂÀº ¹ÝÇâµÇÁö ¾Ê´Â´Ù.
ECHOEerase ¹®ÀÚ¸¦ ¹ÝÇâÇÑ´Ù. ¸¸¾à ÀÌ Ç÷¹±×¿Í ÇÔ²² ECHO Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é ERASE °¡ ¹ß»ýÇÒ°æ¿ì ½ºÅ©¸°¿¡¼­ ¸¶Áö¸· ¹®ÀÚ¸¦ Áö¿ì°Ô µÈ´Ù.
ECHOEerase ¹®ÀÚ¸¦ ¹ÝÇâÇÑ´Ù. ¸¸¾à ÀÌ Ç÷¹±×¿Í ÇÔ²² ECHO Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é ERASE °¡ ¹ß»ýÇÒ°æ¿ì ½ºÅ©¸°¿¡¼­ ¸¶Áö¸· ¹®ÀÚ¸¦ Áö¿ì°Ô µÈ´Ù.
ECHOPRT¸¸¾à ECHO Ç÷¡±×°¡ on µÇ¾îÀÖ°í ECHOPRT°¡ on µÇ¾úÀ»°æ¿ì ERASE °¡ ¹ß»ýÇÑ´Ù¸é (back ½ºÆäÀ̽ºÅ°¸¦ ÀÔ·ÂÇÑ´Ù¸é) »èÁ¦µÇ´Â ¹®ÀÚ°¡ '\' µÚ¿¡ Ç¥½ÃµÇ°Ô µÈ´Ù. ¸¸¾à ¸ðµç ¹®ÀÚ¸¦ »èÁ¦Çß´Ù¸é '/' °¡ Ãâ·ÂµÇ°Ô µÈ´Ù.
ECHOKEBackspace-Space-Backspace entire line on line kill
ECHONLNL¹®ÀÚ°¡ ¹ÝÇâµÈ´Ù. ECHONL Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é, ECHO Ç÷¡±×°¡ on µÇ¾îÀÖÁö ¾Ê´õ¶óµµ NL ¹®ÀÚ°¡ ¹ÝÇâµÈ´Ù.
ECHOCTLÁ¦¾î¹®ÀÚ°¡ ¹ÝÇâµÇµµ·Ï ÇÑ´Ù. Á¦¾î¹®ÀÚ´Â 0¿¡¼­ 37 ±îÁöÀÇ ASCII ÄÚµåÀÌ´Ù. ÀÌ Ç÷¹±×¸¦ on ½ÃŲ»óÅ¿¡¼­ CTRL+X °°Àº Á¦¾î¹®ÀÚ¸¦ ÀÔ·ÂÇÒ°æ¿ì ^X ·Î È­¸é¿¡ Ç¥½ÃµÉ°ÍÀÌ´Ù.

표 5. Á¦¾î¹®ÀÚ ¼Ó¼º°ª - c_cc

¼³¸íc_cc ¹è¿­Àº Á¦¾î¹®ÀÚ¸¦ Á¦¾îÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. Áï CTRL+X, CTRL+X, CTRL+C µîÀÇ ¹®ÀÚ¿Í °ü·ÃµÈ Á¦¾î¸¦ ÇÒ¼ö ÀÖ´Ù.
VINTRÀϽÃÁßÁö(Ctrl+C)¿Í °ü·ÃµÈ Á¦¾îÀÌ´Ù. ¸¸¾à ISIG Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é ÀϽÃÁßÁö ¹®ÀÚ¸¦ ÀԷ½ÃŰ¸é Æ÷±×¶ó¿îµå ÇÁ·Î¼¼½º¿¡ SIGINT ½Ã±×³ÎÀÌ ¹ß»ýµÈ´Ù.
VQUITQuit Á¦¾î¹®ÀÚ Ctrl+\ ¿Í °ü·ÃµÈ´Ù. ISIG Ç÷¡±×°¡ on µÇ¾î ÀÖ°í Quit Á¦¾î¹®ÀÚ°¡ ÀԷµǸé SIGQUIT ½Ã±×³ÎÀÌ ¹ß»ýÇÑ´Ù.
VERASEERASE Á¦¾î¹®ÀÚ(¹é½ºÆäÀ̽º) ¿Í °ü·ÃµÈ´Ù. Á¤±Ô¸ðµå(ICANON) Ç÷¡±× °¡ on µÇ¾î ÀÖ°í, ERASE Á¦¾î¹®ÀÚ°¡ ¹ß»ýÇÏ¸é °¡Àå ¸¶Áö¸· ¹®ÀÚ°¡ Áö¿öÁø´Ù.
VKILLKILL Á¦¾î¹®ÀÚ (Ctrl+u)¿Í °ü·ÃµÈ´Ù.
VEOFCtrl-d Á¦¾î¹®ÀÚ¿Í °ü·ÃµÈ´Ù. ICANON Ç÷¡±×°¡ on µÇ¾î ÀÖ°í, EOF°¡ ¹ß»ýÇϸé Àб⠴ë±âÁßÀÎ ¸ðµç¹®ÀÚµéÀº °³Ç๮ÀÚ¸¦ ¸¸³ªÁö ¾Ê´õ¶óµµ ¹Ù·Î ÇÁ·Î¼¼½º¿¡°Ô Àü´ÞµÈ´Ù.
VSTOPSTOP Á¦¾î¹®ÀÚ(Ctrl+s)¿Í °ü·ÃµÈ´Ù.
VSUSPSUSP Á¦¾î¹®ÀÚ (Ctrl+z)¿Í °ü·ÃµÈ´Ù. ISIG Ç÷¡±×°¡ on µÇ¾îÀÖ´Â »óÅ¿¡¼­ Ctrl+z °¡ ÀÔ·ÂµÇ¸é ¸ðµç Æ÷±×¶ó¿îµå ÇÁ·Î¼¼½º¿¡ SIGSTOP ½ÅÈ£°¡ Àü´ÞµÈ´Ù.
VWERSEWERASE Á¦¾î¹®ÀÚ (Ctrl+w) ¿Í °ü·ÃµÈ´Ù.


2.3.3절. Å͹̳Π¼Ó¼º ¾ò¾î¿À±â

Å͹̳ÎÀÇ ¼Ó¼ºÀ» º¯°æÇϱâ À§Çؼ­´Â ÀÏ´Ü ÇöÀç Å͹̳ÎÀÌ ¼Ó¼ºÀ» ¾ò¾î¿Í¾ß ÇÑ´Ù. ±×¸®°í ³ª¼­ º¯°æÇϰíÇ Å͹̳ÎÀÇ ¼Ó¼º°ªÀ» ºñÆ®¿¬»êÀ» ÀÌ¿ëÇØ¼­ on/off½ÃÄÑÁÖ¸é µÈ´Ù. ÇöÀç Å͹̳ÎÀÇ ¼Ó¼ºÀ» ¾ò¾î¿À±â À§Çؼ­ tcgetattr ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀÌÇÔ¼ö¸¦ »ç¿ëÇϸé Å͹̳ÎÀÇ ¼Ó¼º°ªÀ» ¾ò¾î¿Í¼­ struct termios ±¸Á¶Ã¼¸¦ ä¿îÈÄ µÇµ¹·ÁÁØ´Ù.
int tcgetattr(int fd, struct termios *termios_p);
				
fd ´Â ¼Ó¼ºÀ» ¾Ë±â¸¦ ¿øÇÏ´Â open µÈ ÆÄÀÏ(ÀÏ¹ÝÆÄÀÏ È¤Àº ¹®ÀÚµð¹ÙÀ̽º ÆÄÀÏ) ÀÌ´Ù. ¾Ë¾Æ³½ ¼Ó¼ºÀº termios_p ¿¡ ä¿öÁö°Ô µÈ´Ù.


2.3.4절. Å͹̳Π¼Ó¼º ¼³Á¤

tcgetattr À» ÀÌ¿ëÇØ¼­ Å͹̳Π¼Ó¼ºÀ» °¡Á®¿Ô´Ù¸é, bit ¿¬»êÀ» ÅëÇØ¼­ Å͹̳Π¼Ó¼º°ªÀ» º¯°æÇØÁÙ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¿¬»êÀº tcsetattr ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.
#include <termios.h>
#include <unistd.h>

int tcsetattr(int fd, int optional_actions, 
              struct termios *termios_p);
				
fd ´Â ¼Ó¼ºÀ» º¯°æ½ÃŰ±â ¿øÇÏ´Â openµÈ ÆÄÀÏ(Å͹̳Î)À» °¡¸®Å°´Â ÆÄÀÏ ÁöÁ¤ÀÚÀÌ´Ù. tcgetattr ·Î °¡Á®¿Â ¼Ó¼ºÀ» ºñÆ®¿¬»êÀ» ÅëÇÏ¿© Àû´çÈ÷ º¯°æ½ÃŲÈÄ(termios ±¸Á¶Ã¼ÀÇ ¸â¹öº¯¼ö¸¦ ÀÌ¿ë) À§ÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ º¯°æÇÒ¼ö ÀÖ´Ù. optioal_actions ´Â º¯°æµÈ Å͹̳Π¼³Á¤ÀÌ ¾ðÁ¦½ÃÁ¡¿¡¼­ Àû¿ëµÉ°ÍÀÎÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ´ÙÀ½ÀÇ 3°¡Áö °ªÁß¿¡ Çϳª¸¦ ¼±ÅÃÇØ¼­ ÁöÁ¤ÇÒ¼ö ÀÖ´Ù.

TCSANOW

tcsetattr À» È£ÃâÇÑÁï½Ã Å͹̳Π¼Ó¼ºº¯°æ»çÇ×ÀÌ Àû¿ëµÈ´Ù.

TCSADRAIN

ÇØ´ç ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ ´ëÇÑ ¸ðµç Ãâ·ÂÀÌ Á¾·áµÈ´ÙÀ½¿¡ ¼Ó¼ºº¯°æ»çÇ×ÀÌ Àû¿ëµÈ´Ù.

TCSAFLUSH

ÇØ´ç ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ ´ëÇÑ ¸ðµç Ãâ·ÂÀÌ Á¾·áµÈ´ÙÀ½ ¼Ó¼ºº¯°æ»çÇ×ÀÌ Àû¿ëµÈ´Ù. º¯È­°¡ ¹ß»ýÇÒ¶§ ÀÐÇôÁöÁö ¾ÊÀº µ¥ÀÌŸ´Â ¹ö·ÁÁø´Ù.


2.3.5절. ¸î°¡Áö ¿¹Á¦µé

ÀÌ»ó Å͹̳Π¼³Á¤¿¡ °üÇÑ ´Ù¾çÇÑ ³»¿ëµé¿¡ ´ëÇØ¼­ ¾Ë¾ÆºÃ´Âµ¥, ¸î°¡Áö ¿¹Á¦¸¦ ÅëÇØ¼­ È®½ÇÈ÷ ÀÌÇØ¸¦ ÇØº¸µµ·Ï ÇÏÀÚ.

¿ì¸®´Â À§¿¡¼­ termios ±¸Á¶Ã¼ÀÇ c_lflag ¸¦ ÀÌ¿ëÇÏ¸é »ç¿ëÀÚ Å͹̳ÎÀÇ ¼Ó¼ºÀ» º¯°æ½Ãų¼ö ÀÖ´Ù´Â °ÍÀ» ¹è¿ü´Ù. º¸ÅëÀÇ Å͹̳ΠÇÁ·Î±×·¥À» »ç¿ëÇϸ鼭 ÀÔ·ÂÀ» ÇÏ´Â µµÁß¿¡ CTRL+C µîÀ» ÀÔ·ÂÇϸé SIGINT ½ÅÈ£°¡ ¹ß»ýÇØ¼­ ÇÁ·Î±×·¥ÀÌ Á״´ٴ °ÍÀ» ¾Ë°í ÀÖ´Ù(½Ã±×³Î Çڵ鷲¸£ ¼³Ä¡ÇÏÁö ¾Ê¾ÒÀ»°æ¿ì). ±×·¯³ª ¶§¶§·Î ÀԷµµÁß¿¡ CTRL+C, CTRL+Z µîÀÇ Å°ÀÔ·ÂÀ» ¹«½ÃÇÏ°í ½ÍÀ»¶§°¡ ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·²°æ¿ì temios ±¸Á¶Ã¼¿Í tcgetattr, tcsetattr À» ÀÌ¿ëÇÔÀ¸·Î½á °£´ÜÇÏ°Ô À§ÀÇ Æ¯¼ö¹®ÀÚµéÀ» ¹«½ÃÇÒ¼ö ÀÖ´Ù. ´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.

sig_ign.c
#include <stdio.h>
#include <termios.h>

struct termios old_settings;
int main()
{
    struct termios new_settings;
    char buf[80];
    tcgetattr(0, &old_settings);
    new_settings = old_settings;
    new_settings.c_lflag &= (~ISIG); // Ư¼ö¹®ÀÚ ¹«½Ã
    tcsetattr(0, TCSANOW, &new_settings);

    fgets(buf, 80, stdin);
    fputs(buf, stdout);
    tcsetattr(0, TCSANOW, &old_settings);
}
				
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѼ­ ÀԷµµÁß¿¡ CTRL+C, CTRL+Z µîÀÇ Å°¸¦ ´­·¯¼­ ¾î¶»°Ô Å͹̳ÎÀÌ ¹ÝÀÀÇÏ´ÂÁö È®ÀÎÇØ º¸¸é Ư¼ö¹®ÀÚµéÀÌ ¹«½ÃµÇ°í ÀÖ´Ù´Â°É ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.
[root@localhost c_source]# ./sig_ign
^X^C^Z
				
À§ÀÇ °æ¿ì´Â CTRL+X, CTRL+C, CTRL+Z ¸¦ ÀÔ·ÂÇÑ °æ¿ìÀε¥, ¸ðµç Ư¼ö¹®ÀÚÀÔ·ÂÀ» ¹«½ÃÇϰí ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.

¶Ç´Ù¸¥ ¿¹Á¦¸¦ ¸¸µé¾îº¸ÀÚ. ¿ì¸®´Â °¡²û »ç¿ëÀÚÀÇ ÀÇÇâÀ» ¹¯´Â ·çƾÀ» ¸¸µé¾î¾ßÇÒ Çʿ䰡 ÀÖ´Ù º¸ÅëÀº (Y/N) µîÀÇ ¹®ÀÚ¸¦ ÅëÇØ¼­ ÀÇÇâÀ» ¹¯°Ô µÇ´Âµ¥, »ç¿ëÀÚ°¡ ´ë¼Ò¹®ÀÚ¸¦ ºÒ¹®Çϰí ÀÔ·ÂÇÒ¼ö Àֱ⠶§¹®¿¡, ÀԷ°˻çÇÒ¶§ ´ë¼Ò¹®ÀÚ¸¦ µû·Î°Ë»çÇØ¾ß ÇÑ´Ù. ÀÌ·²¶§ ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î Å͹̳ÎÀÇ ¼Ó¼ºÀ» º¯°æÇÔÀ¸·Î½á, Á»´õ ±ò²ûÇÏ°Ô ¸¶¹«¸®ÇÒ¼ö ÀÖ´Ù.

input.c
#include <stdio.h>
#include <termios.h>

struct termios old_settings;
int main()
{
    struct termios new_settings;
    char buf;

    tcgetattr(0, &old_settings);
    new_settings = old_settings;
    new_settings.c_oflag |= OLCUC;

    tcsetattr(0, TCSANOW, &new_settings);

    printf("youre OK (Y/N)? ");
    buf=getc(stdin);
	printf("your input is %c\n", buf);
    tcsetattr(0, TCSANOW, &old_settings);
}
				
À§ÀÇ ¿¹Á¦ ½ÇÇàÇÏ¸é »ç¿ëÀÚ°¡ ´ë¹®ÀÚ¸¦ ÀÔ·ÂÇ졂 ¼Ò¹®ÀÚ¸¦ ÀÔ·ÂÇϵçÁö °£¿¡ ¹«Á¶°Ç ´ë¹®ÀڷΠġȯµÈ´Ù´Â°É ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ±×·±µ¥ »ç¿ëÀÚ°¡ 'Y' ¸¦ ÀÔ·ÂÇÑ´ÙÀ½¿¡ Enter ۸¦ ´­·¯¾ßÁö¸¸ ³»¿ëÀÌ Àü´Þ µÈ´Ù. ±×³É 'Y' ¸¸ ´©¸£¸é ¹Ù·Î Àü´ÞµÇ°Ô ÇÒ¼ö ¾øÀ»±î? ±×·²¶§´Â Å͹̳Π¼Ó¼ºÀ» "ºñÁ¤±Ô¸ðµå"·Î º¯°æ½ÃÄÑ ÁÖ¸é µÈ´Ù. À§ Äڵ忡 new_settings.c_lflag &= (~ICANON); ÇÑÁÙ¸¸ Ãß°¡½ÃÄÑÁÖ¸é µÈ´Ù.

ÇöÀç Å͹̳ÎÀÌ ¸î bit¸¦ ó¸®ÇÏ´ÂÁö ¾Ë¾Æ¿À´Â ¿¹Á¦¸¦ ¸¸µé¾îº¸µµ·Ï ÇÏÀÚ. ¿ª½Ã ¸Å¿ì °£´ÜÇÏ´Ù.

¿¹Á¦: csize.c
#include <stdio.h>
#include <termios.h>

struct termios old_settings;
int main()
{
    struct termios new_settings;
    int size;
    char buf;

    tcgetattr(0, &new_settings);
    size = new_settings.c_cflag&CSIZE ;

    if (size == CS7) printf("7bits/byte\n");
    else if (size == CS8) printf("8bits/byte\n");
}
				

´ÙÀ½Àº Å͹̳ÎÀÇ ¼Óµµ¸¦ °¡Á®¿À´Â °£´ÜÇÑ ¿¹Á¦ÄÚµåÀÌ´Ù.

¿¹Á¦ : baud.c
#include <termios.h>
#include <stdio.h>

int main()
{
    struct termios new_settings;
    int baud;

    tcgetattr(0, &new_settings);

    baud = new_settings.c_cflag&CBAUD;

    if (baud == B9600) printf("speed 9600 baud\n");
    else if (baud == B19200) printf("speed 19200 baud\n");
}
				
¾Æ¸¶µµ B9600 À¸·Î °ªÀÌ ³ª¿Ã°ÍÀÌ´Ù.

¸¶Áö¸·À¸·Î termios ±¸Á¶Ã¼ÀÇ c_cc °ªÀ» ÀÌ¿ëÇØ¼­ Å͹̳Π¼Ó¼ºÀ» º¯°æ ÇÏ´Â ¿¹Á¦ÀÌ´Ù.

c_cc.c
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

struct termios old_settings;
int main()
{
    struct termios new_settings;
    int vdisable;
    char buf[255];

    if (vdisable = fpathconf(0, _PC_VDISABLE) < 0)
    {
        perror("error ");
        exit(0);
    }

    tcgetattr(0, &new_settings);

    old_settings = new_settings;
    new_settings.c_lflag |= ICANON;
    new_settings.c_cc[VSUSP] = vdisable;

    tcsetattr(0, TCSAFLUSH, &new_settings);
    memset(buf, 0x00, 255);
    read(0, buf, 255);
    printf("%s\n", buf);

    tcsetattr(0, TCSAFLUSH, &old_settings);
    exit(0);
}
				
À§ÀÇ ¿¹Á¦´Â c_cc ¹è¿­À» ÀÌ¿ëÇØ¼­ Å͹̳ÎÀÇ Æ¯¼ºÀ» º¯°æÇÑ °ÍÀ¸·Î, Ctrl+z ۸¦ ´­·¯µµ SIGSTOP ½ÅÈ£°¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï Çß´Ù. fpathconf ÇÔ¼ö¿¡ ´ëÇÑ ³»¿ëÀº man ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù. ¸¸¾à ¹®ÀÚÀԷµµÁß¿¡ Ctrl+D ¸¦ ´­·¯µµ ÀÔ·ÂÀÌ Á¾·áµÇÁö ¾Êµµ·Ï ÇÏ·Á¸é VSUSP ´ë½Å¿¡ VEOF ¸¦ ³Ö¾îÁÖ¸é µÈ´Ù.


2.3.6절. Å͹̳Π°Ë»çÇϱâ

¿ì¼± open µîÀ» ÅëÇØ¼­ ¿­¸° ÆÄÀÏÁöÁ¤ÀÚ fd °¡ ÀåÄ¡¿¡ ¿¬°áµÈ°ÍÀÎÁö ¾Æ´Ï¸é ÀÏ¹ÝÆÄÀÏ¿¡ ¿¬°áµÈ°ÍÀÎÁö ¾Ë¾Æ³»¾ß ÇÒ°ÍÀÌ´Ù. isatty(3) À» ÀÌ¿ëÇÏ¸é µÈ´Ù.
#include <unistd.h>

int isatty ( int fd );
				
isatty ´Â ÀÎÀÚ·Î ÁÖ¾îÁö´Â fd ¸¦ °Ë»çÇØ¼­ ¸¸¾à Å͹̳ÎÀ̶ó¸é 1 ±×·¸Áö ¾Ê´Ù¸é 0À» µÇµ¹·ÁÁØ´Ù.

¿¹Á¦ : isatty.c
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>

int main()
{
    int fd;
    printf("%d\n", isatty(0));

    fd = open("test100.txt", O_RDWR);
    printf("%d\n", isatty(fd));
    close(fd);

    fd = open("/dev/ttyS0", O_RDONLY);
    if (fd < -1)
    {
        printf("open error\n");
        exit(0);
    }
    printf("%d\n", isatty(fd));
    close(fd);
    exit(0);
}
				

¿­¸° ÆÄÀÏÁöÁ¤ÀÚ fd ¿¡ ´ëÇÑ Å͹̳ÎÀ̸§À» ¹Ýȯ¹Þ°í ½Í´Ù¸é ttyname(3) ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
#include <unistd.h>

char *ttyname ( int fd );
				
¸¸¾à fd°¡ Å͹̳ο¡ ¿¬°áµÇ¾î ÀÖÁö ¾Ê´Ù¸é NULLÀ» ¹ÝȯÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ÀåÄ¡ÆÄÀÏ À̸§À» ¸®ÅÏÇÒ°ÍÀÌ´Ù.
#include <unistd.h>

int main()
{
    char *tty;

    if (isatty(0))
    {
        tty = ttyname(0);
        printf("%s\n", tty);
    }
    else
    {
        printf("not tty\n");
    }
}
				


2.3.7절. Å͹̳ΠÀ©µµ¿ì »çÀÌÁî

¿äÁò¿¡ ¿Í¼­ ´ëºÎºÐÀÇ Å͹̳ÎÀº Å͹̳Π¿¡¹Ä·¹ÀÌÅÍ ¾îÇø®ÄÉÀ̼ÇÀ» ÅëÇØ¼­ X À©µµ»ó¿¡¼­ ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù. À̰æ¿ì Å͹̳ΠÀ©µµ¿ì »çÀÌÁî°¡ Áß¿äÇØÁø´Ù. À©µµ¿ìÀÇ Å©±âº¯È­¿¡ µû¶ó¼­ È­¸é¸ð¾çÀ» ´Ù½Ã ±×·ÁÁà¾ßÇÒ Çʿ䰡 Àֱ⠶§¹®ÀÌ´Ù.

¿ì¸®°¡ X À©µµ¿ì»ó¿¡¼­ Å͹̳Π¿¡¹Ä·¹ÀÌÅÍÀÇ Å©±â¸¦ º¯È­½Ã۸é, SIGWINCH ½Ã±×³ÎÀÌ ¹ß»ýÇÑ´Ù. ±×·³À¸·Î À©µµ¿ì Å©±âÀÇ º¯È­¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â SIGWINCH ½Ã±×³Î¿¡ ´ëÇÑ ½Ã±×³Î Çڵ鷯¸¦ ¼³Ä¡Çϰí, ½Ã±×³Î ÇÚµéÀÌ È£ÃâµÇ¾úÀ»¶§, ÇöÀç Å͹̳ÎÀÇ »çÀÌÁ °è»êÇÏ¸é µÉ°ÍÀÌ´Ù. Å͹̳ÎÀÇ »çÀÌÁî °è»êÀº ioctl(2) ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

¿¹Á¦ : change_winsize.c
#include <signal.h>
#include <sys/ioctl.h>
#include <stdio.h>

// À©µµ¿ì »çÀÌÁ ¾ò¾î¿Â´Ù. 
struct winsize get_winsize(int fd)
{
    int i;
    struct winsize size;
    if (ioctl(fd, TIOCGWINSZ, (char *)&size) < 0)
    {
        perror("size get error\n");
    }
    return size;
}
void sig_handler(int);

struct winsize c_winsize;
int main()
{

    // Ç¥ÁØÀÔ·ÂÀÌ ÀåÄ¡¿¡ ¿¬°áµÇ¾î ÀÖ´ÂÁö È®ÀÎÇÑ´Ù.  
    if (!isatty(0))
        exit(0);

    // ½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇÑ´Ù.  
    if(signal(SIGWINCH, sig_handler) == SIG_ERR)
    {
        perror("error : ");
        exit(0);
    }
    c_winsize = get_winsize(0);
    printf("%d %d %d %d\n", c_winsize.ws_row, c_winsize.ws_col,
                            c_winsize.ws_xpixel, c_winsize.ws_ypixel);

    // âÀÌ ÀÏÁ¤ »çÀÌÁîÀÌ»óÀÌ µÇÁö ¾ÊÀ»°æ¿ì Á¾·á½ÃŲ´Ù. 
    if (c_winsize.ws_col < 80 || c_winsize.ws_row < 20)
    {
        printf("À©µµ¿ì »çÀÌÁî´Â 80, 20ÀÌ»óÀÌ µÇ¾î¾ß ÇÕ´Ï´Ù\n");
        exit(0);
    }
    while(1)
    {
        sleep(10);
    }
}

void sig_handler(int signo)
{
    printf("WINSIZE CHANGE\n");
    c_winsize = get_winsize(0);
    printf("%d %d %d %d\n", c_winsize.ws_row, c_winsize.ws_col,
                            c_winsize.ws_xpixel, c_winsize.ws_ypixel);
}
				
winsize ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
struct winsize
{
    unsigned short int ws_row;
    unsigned short int ws_col;
    unsigned short int ws_xpixel;
    unsigned short int ws_ypixel;
};
				
ws_row, ws_col Àº ¹®ÀÚ´ÜÀ§ÀÇ Å©±âÀ̸ç, ws_xpixel, ws_ypixel Àº Çȼ¿´ÜÀ§ Å©±âÀÌ´Ù. hanterm °ú °°Àº Å͹̳Π¿¡¹Ä·¹ÀÌÆ® ÇÁ·Î±×·¥À» ¶ç¿î´ÙÀ½ À§ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í âÀÇ Å©±â¸¦ º¯°æ½ÃŰ¸é¼­ Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.


2.3.8절. stty ¸í·É¾î

Âü°í·Î ½©»ó¿¡¼­ stty ¸í·ÉÀ» ÀÌ¿ëÇϸé, ÇöÀç Å͹̳ÎÀÇ »ó¼¼ ¼Ó¼º°ªµéÀ» ¾ò¾î¿Ã¼ö ÀÖ´Ù.
[root@localhost c_source]# stty -a
speed 9600 baud; rows 30; columns 80; line = 0;
intr = ^C; quit = ^\; erase = <undef>; kill = ^U; eof = ^D; eol = <undef>
eol2 = <undef>; start = ^Q; stop = ^S; susp = <undef> rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
				
¾Õ¿¡ '-' °¡ ºÙÀº°ÍÀº ºñȰ¼ºÈ­ µÇ¾ú´Ù´Â ¶æÀÌ´Ù. ÀÌ·¯ÇÑ Å͹̳Π¼Ó¼º°ªÀº ÀÚ½ÄÇÁ·Î¼¼½º¿¡°Ô »ó¼ÓÀÌ µÈ´Ù. À§ÀÇ ÇÁ·Î±×·¥µéÀ» ¼Ó¼ºº¯°æÈÄ fork&exec ±â¹ýÀ¸·Î ½©À» ½ÇÇà½Ã۵µ·Ï ÇØ¼­ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۱âÀüÀÇ stty Ãâ·Â°ª°ú ÇÁ·Î±×·¥½ÇÇàÇØ¼­ ¼Ó¼ºº¯°æÈÄ fork&exec µÈ ½©¿¡¼­ stty ÀÇ Ãâ·Â°ª°ú Çѹø ºñ±³ÇØ º¸±â ¹Ù¶õ´Ù.


3절. °á·Ð

ÀÌ»ó termios ±¸Á¶Ã¼¿Í À̰ÍÀ» ÀÌ¿ëÇÑ Å͹̳Π¼Ó¼ºº¯°æ¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼­´Â ÀϹÝÀûÀÎ Å͹̳ÎÀΠŰº¸µå+¸ð´ÏÅ͸¦ ±âÁØÀ¸·Î ¼³¸íÇϰí Àִµ¥, ½Ã¸®¾óÅë½ÅÀ» À§ÇÑ Å͹̳Π¼Ó¼º¿¡ ´ëÇÑ ³»¿ëÀº ºüÁ®ÀÖ´Ù. ÀÌ ³»¿ëµéÀº ½Ã¸®¾óÇÁ·Î±×·¡¹Ö°ü·Ã °­Á¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ. ¾î¶µç ½Ã¸®¾óÇÁ·Î±×·¡¹Ö ¿ª½Ã ±âº»ÀûÀ¸·Î À̹®¼­¿¡¼­ ´Ù·é ³»¿ë¿¡ ¸î°¡Áö´õ Ãß°¡µÇ´Â °ÍÀÓÀ¸·Î, À̹®¼­¸¦ ÀÐÀºÈÄ¿¡ ½Ã¸®¾óÇÁ·Î±×·¡¹Ö °ü·Ã ¹®¼­¸¦ º¸¸é ½±°Ô ÀÌÇØ°¡ µÉ°ÍÀÌ´Ù.