 | |
ÀλýÀº ´ÙÀ½ µÎ°¡Áö·Î ¼º¸³µÈ´Ù. ÇÏ°í ½ÍÁö¸¸ ÇÒ ¼ö ¾ø´Ù. ÇÒ ¼ö ÀÖÁö¸¸ ÇÏ°í ½ÍÁö ¾Ê´Ù. - ±«Å× -
Å͹̳ÎÁ¦¾î Posted on 2002/12/4
Topic: ½Ã½ºÅÛ ÇÁ·Î±×·¥
|
À̹ø ±â»ç´Â termios °ü·Ã ÇÔ¼ö¸ðÀ½À» ÀÌ¿ëÇÑ
Å͹̳ÎÁ¦¾î¿¡ °üÇÑ ³»¿ëÀ» ´Ù·ç¸ç,
±×Áß¿¡¼µµ ½±°Ô Á¢ÇÒ¼ö Àִ Űº¸µå+¸ð´ÏÅͽÖÀ¸·Î
±¸¼ºµÈ Å͹̳ΰü·Ã ³»¿ëÀ» ´Ù·é´Ù.
Å͹̳ΠÁ¦¾î
Å͹̳Î(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) ¿Í ¿¬°áÇØ¼
ÀÛ¾÷ÇÏ´Â°É º¸¾ÒÀ»°ÍÀÌ´Ù.
ÅØ½ºÆ® Å͹̳ÎÀº È£½ºÆ® ÄÄÇ»ÅÍ¿Í Åë½ÅÇϱâ À§Çؼ
ASCII Äڵ带 ÀÌ¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ASCII ÄÚµå´Â
º¸ÅëÀº Űº¸µå¸¦ ÅëÇØ¼ ¹Ù·Î ÀÔ·ÂÀÌ °¡´ÉÇÑ ¹®ÀÚµéÀ̸ç
¸ð´ÏÅ͸¦ ÅëÇØ¼ ¹Ù·Î Ãâ·ÂµÉ¼ö ÀÖ´Ù.
±×¸®°í ÀÌ·¯ÇÑ ¹®ÀÚµé¿Ü¿¡µµ ¸î°¡Áö Á¦¾î¸¦ À§ÇÑ
¹®ÀÚ(Special control byte)µéÀÌ Á¸ÀçÇÑ´Ù.
À̵é Á¦¾î¹®ÀÚ´Â Ä¿¼À̵¿, »èÁ¦ ¿Í °°Àº ÀÔ·ÂÀ»
Á¦¾îÇϱâ À§Çؼ »ç¿ëµÈ´Ù.
ÀÌ·¯ÇÑ Á¦¾î¹®ÀÚ´Â ¼ö¹é°¡Áö
Á¾·ù°¡ Á¸ÀçÇϰí ÀÖ´Ù.
¶ÇÇÑ °Á¶±ÛÀÚ(bold) ¹ØÁÙ¹®ÀÚ(underline) ¿Í »ö»óº¯°æ°ú
°°Àº Ãâ·Â ¸ð¾çÀÇ Á¶Á¤À» ÇÒ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ Ãâ·Â¸ð¾ç
Á¶Á¤À» À§Çؼ ANSI ¸¦ »ç¿ëÇÑ´Ù.
À̵é ÅØ½ºÆ® Å͹̳ÎÀº ±âº»ÀûÀ¸·Î ASCII Äڵ常À» ÅëÇØ¼ Åë½ÅÀ»
Çϱ⠶§¹®¿¡, ¸Å¿ìÀú·ÅÇÏ°Ô Àü¿ëÀåÄ¡¸¦ °³¹ßÇÒ¼ö ÀÖÀ¸¸ç,
¾îÇø®ÄÉÀÌ¼Ç ¿ª½Ã ½±°Ô °³¹ß°¡´ÉÇÏ´Ù.
- Á¤È®È÷ ¸»ÇÏÀÚ¸é ASCII 256 Áß¿¡ »óÀ§ 128 °³¸¸À»
»ç¿ëÇÑ´Ù -
386, 286 ±Þ ÄÄÇ»ÅÍ Á¤µµ¸é ÃæºÐÈ÷ Å͹̳ΠÀåÄ¡·Î »ç¿ëÇÒ¼ö
ÀÖÀ»°ÍÀ̸ç, ¸¸¾à È޴뼺ÀÌ Áß¿äÇÏ´Ù¸é ¾×Á¤µð½ºÇ÷¹À̰¡
´Þ¸° ¸Å¿ì Á¶±×¸¶ÇÑ ½ÎÀÌÁî·Î ¸¸µé¼öµµ ÀÖÀ»°ÍÀ̸ç,
½ÇÁ¦ ¶ó¿ìÅÍ ¼¼ÆÃÀ» À§ÇÑ Àü¿ë ÀåÄ¡µéÀÌ ¾×Á¤µð½ºÇ÷¹ÀÌ¿Í
Űº¸µå¸¸À» °®Ãá ÇüÅ·Π»ç¿ëµÇ¾îÁö°í ÀÖ´Ù.
text Å͹̳ÎÀÌ ¾Æ´Ñ°ÍÀº Thin Clients(ȤÀº À©µµ¿ì Å͹̳Î)
¶ó°í ¸»ÇÒ¼ö ÀÖ´Ù.
Åë½Å¼ö´ÜÀ¸·Î ±×·¡ÇÈ Á¤º¸¸¦ »ç¿ëÇÑ´Ù. À̵é Thin Clients ÀÇ
°æ¿ì Àü¼Û¹ÞÀº GUI ȸéÀ» ºü¸¥½Ã°£¿¡ ¸ð´ÏÅÍ¿¡ »Ñ·ÁÁÙ¼ö
ÀÖ¾î¾ß ÇÔÀ¸·Î ÅØ½ºÆ® Å͹̳ÎÀ» ±¸ÇöÇϱâ À§ÇÑ ÀåÄ¡º¸´Ù ´õ
ºñ¿ëÀÌ ¸¹À̵ç´Ù.
¶ÇÇÑ ±×·¡ÇÈÁ¤º¸¸¦ Àü¼ÛÇØ¾ß ÇÔÀ¸·Î ÅØ½ºÆ® Å͹̳κ¸´Ù
³×Æ®¿÷ ÀÚ¿øÀ» ¸¹ÀÌ ¼Ò¸ðÇÑ´Ù.
Thin Ŭ¶óÀÌ¾ðÆ®¸¦ ÀÌ¿ë ÇÒ°æ¿ì ¸¹Àº ÀúÀå°ø°£°ú ºü¸¥ ¿¬»ê´É·ÂÀ»
°¡Áø Áß¾ÓÄÄÇ»Å͸¦ ÇϳªµÎ°í, ´Ù¸¥ »ç¿ëÀÚ´Â ÀûÀº ÀúÀå°ø°£°ú
»ó´ëÀûÀ¸·Î ´À¸° ¿¬»ê´É·ÂÀ» °¡Áø (Thin) ÄÄÇ»Å͸¦ µÎ¾î¼
½ÇÁ¦ ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇϰųª, µ¥ÀÌŸ¸¦ ÀÌ¿ëÇÒ¶§
Áß¾Ó ÄÄÇ»ÅÍ¿¡ ¿¬°áÇØ¼ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ´Â ÄÄÇ»ÆÃ ȯ°æÀ»
¸¸µé¼ö ÀÖÀ»°ÍÀÌ´Ù.
ÀÌ·²°æ¿ì ¿©·¯°¡Áö Áß¿ä Á¤º¸°¡ Áß¾ÓÄÄÇ»ÅÍ¿¡ ÁýÁߵǰí,
´Ù¼öÀÇ ¿¬°á »ç¿ëÀÚ ÄÄÇ»ÅÍ¿¡ ÅõÀÚÇÏ´Â ºñ¿ëÀ» ÁÙÀϼö ÀÖÀ½À¸·Î
Á¤º¸°ü¸®¿Í ºñ¿ëÃø¸é¿¡¼ ÀÌÀÍÀ» º¼¼ö ÀÖÀ»°Å¶ó°í »ý°¢µÈ´Ù.
±×·¯³ª ½ÇÁ¦·Î ÀÌ·¯ÇÑ ÄÄÇ»ÆÃ ȯ°æÀ» ¸¸µé¾î¼ ¾²´Â °æ¿ì´Â
±×¸® ÈçÇÏÁö ¾Ê´Ù. Áö¿ª³×Æ®¿÷¿¡ °úµµÇÑ ºÎÇϸ¦ À¯¹ßÇÒ¼ö ÀÖ°í,
Áß¾Ó ÄÄÇ»ÅÍ¿¡ ¹®Á¦°¡ »ý°åÀ» °æ¿ì ¸ðµç ÀÛ¾÷ÀÌ Áߴܵɼö
Àֱ⠶§¹®ÀÌ´Ù. °Å±â¿¡ ÀÚ½ÅÀÇ Á¤º¸°¡ ÀÚ½ÅÀÌ Çϵ忡 ÀÖÁö ¾Ê°í
Áß¾ÓÀÇ ´Ù¸¥ Çϵ忡 ÀÖ´Ù´Â °Í ÀÚü¸¦ ¸¹Àº Á÷¿øµéÀÌ ½È¾îÇÏ´Â
(¹Ï¾î¿ö ÇÏÁö ¸øÇÏ´Â) °æÇâÀÌ Àֱ⠶§¹®ÀÌ´Ù.
±×·¡¼ ÁÖ·Î ¿ø°ÝÁöÀÇ MS À©µµ¿ìÁî °è¿ÀÇ ¼¹ö¸¦ °ü¸®Çϱâ
À§ÇÑ ¸ñÀûÀ¸·Î ¸¹ÀÌ ¾²ÀδÙ.
VNC ¶óµçÁö Windows Terminal Server °¡ ÀÌ·¯ÇÑ ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù.
¸®´ª½ºÀÇ X À©µµ¿ìÀÇ °æ¿ì C/S ȯ°æÀ¸·Î ¸¸µé¾îÁ®
Àֱ⠶§¹®¿¡ ±âº»ÀûÀ¸·Î Window Å͹̳ηνáÀÇ ¿ªÈ°À» ¼öÇàÇÒ¼ö
ÀÖ´Ù.
¿©±â¿¡¼´Â ±âº»ÀûÀ¸·Î text terminal À» ±âÁØÀ¸·Î ¼³¸íÇÏ°Ô µÉ°ÍÀ̸ç,
Å×½ºÆ®¸¦ Çϱâ À§ÇÑ ¿î¿µÃ¼Á¦´Â Linux (Kernel 2.4.x) °¡ µÉ°ÍÀÌ´Ù.
¶ÇÇÑ ½Ã¸®¾óÅë½ÅÀ» À§ÇÑ terminal ȯ°æ°ú °°Àº °ÍµéÀº ´Ù·çÁö ¾ÊÀ»°ÍÀÌ´Ù.
À̹®¼¿¡¼´Â PC¿¡¼ °¡Àå ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â Űº¸µå+¸ð´ÏÅÍ (/dev/tty)
¿¡ ´ëÇØ¼¸¸ ´Ù·ê°ÍÀÌ´Ù. ½Ã¸®¾óÅë½Å°ú °°Àº Ư¼ö? ÇѰ͵éÀº
¿ª½Ã(-.-;) ±âȸ°¡ µÈ´Ù¸é(¾ðÁ¨°¡) ´Ù·çµµ·Ï ÇϰڴÙ.
±âº»ÀûÀ¸·Î »ç¿ëÀÚ´Â ÄÄÇ»ÅÍȤÀº ¿©·¯°¡Áö
ÁÖº¯ÀåÄ¡¿Í ´ëÈÇÒ¶§ Å͹̳ÎÀ» ÀÌ¿ëÇØ¼ ´ëÈÇϰÔ
µÈ´Ù.
º¸Åë ¿ì¸®°¡ ÄÄÇ»ÅÍ ¸ð´ÏÅÍ ¾Õ¿¡ ¾É¾Æ¼ ÀÛ¾÷À» ÇÒ¶§´Â Ç¥ÁØ
Å͹̳ÎÀåÄ¡ÀÎ /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;
}
|
À§ÀÇ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ ÆÐ½º¿öµå¸¦ ÀԷ¹޴ ÀÏÀ»ÇÑ´Ù.
ÆÐ½º¿öµåÀÇ °æ¿ì ȸ鿡 ¹Ù·Î Ãâ·ÂµÇ¸é ¾ÈµÊÀ¸·Î,
Å͹̳ÎÀÇ ¶óÀÎ Ãâ·Â Ư¼ºÀ» "¹ÝÇâ ²û" À¸·Î ¼³Á¤Çϰí ŰÀÔ·ÂÀ»
¹Þ¾ÆµéÀ̵µ·Ï Çß´Ù. ±×¸®°í »ç¿ëÀÚ Å°ÀÔ·ÂÀ» "*" ·Î ´ëü
½ÃÄѼ ȸ鿡 Ãâ·ÂÇϵµ·Ï ÇØ¼ »ç¿ëÀÚ ÆÐ½º¿öµå¸¦ ÀÔ·Â
¹Þµµ·Ï ¸¸µé¾ú´Ù.
°¢°¢ÀÇ Å͹̳ÎÀº ÀÚ½ÅÀÌ »ç¿ëÇÏ´Â ÀåÄ¡ÆÄÀÏ¿¡ ¿¬°áÇØ¼
Åë½ÅÀ» ÇÏ°Ô µÈ´Ù. ¿¹¸¦µé¾î 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 ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÀÐÀ» µ¥ÀÌŸ°¡ ÀÖ´ÂÁö
°Ë»çÇϰí, µ¥ÀÌŸ°¡ µé¾î¿À¸é À̰ÍÀ» Àû´çÇÏ°Ô Ã³¸®Çϵµ·Ï ÇØÁÖ¸é µÈ´Ù.
¹°·Ð ³»ºÎÀûÀ¸·Ð ¸î°¡Áö ´Ù¸¥ ÀϵéÀ» ÇØÁà¾ß °ÚÁö¸¸, °³³äÀûÀ¸·Î º¸ÀÚ¸é ¸Å¿ì °£´ÜÇϰÔ
±¸Çö°¡´ÉÇÔÀ» ¾Ë¼ö ÀÖ´Ù.
À¯´Ð½º¿¡¼´Â ÀÌ·¯ÇÑ Å͹̳ÎÁ¦¾î¸¦ À§Çؼ termios ¶ó´Â ÇÔ¼ö¸ðÀ½À» Á¦°øÇÑ´Ù.
¿ì¸®´Â ÀÌ ÇÔ¼öµéÀ» ÅëÇØ¼ Å͹̳ÎÀ» ¿øÇÏ´Â ¹æÇâÀ¸·Î Á¦¾îÇÒ¼ö ÀÖ°Ô µÈ´Ù.
À̹øÀå¿¡¼´Â termios ÇÔ¼öµé¿¡ ´ëÇÑ ¼³¸í°ú À̸¦ ÀÌ¿ëÇÑ Å͹̳ÎÁ¦¾îÀÇ ¹æ¹ý¿¡
´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
±âº»ÀûÀ¸·Î termios ´Â µð¹ÙÀ̽º(ÀåÄ¡)¿ÍÀÇ asynchronous(ºñµ¿±â) Åë½ÅÀ» À§ÇÑ
ÇÁ·Î±×·¡¹Ö ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù.
Å͹̳ÎÀº Å©°Ô 2°¡Áö ¸ðµåÀÎ "Á¤±Ô¸ðµå"¿Í "ºñÁ¤±Ô¸ðµå" ·Î
³ª´¶´Ù. À̰͵éÀº Å͹̳ÎÀ» Á¦¾îÇϴµ¥ ¸Å¿ì Áß¿äÇÑ ¿ä¼ÒÀÓÀ¸·Î
º°µµÀÇ ÀåÀ» ¸¸µé¾î¼ ¼³¸íÀ» Çß´Ù.
ÈçÈ÷ Á¤±Ô¸ðµå¶ó°í Çϸç
±âº»ÀûÀ¸·Î ¶óÀδÜÀ§·Î ÀÔÃâ·ÂÀ» ó¸®ÇÏ°Ô µÈ´Ù.
¿©±â¿¡¼ ¸»ÇÏ´Â ¶óÀÎÀÇ °³³äÀº ¿ì¸®µéÀÌ ¿¡µðÅÍ¿¡¼ ÀÛ¾÷ÇÒ¶§ÀÇ
¶óÀΰú °°Àº °³³äÀ¸·Î '\n' ȤÀº EOF(End-Of-File) ¸¦
¸¸³¯¶§±îÁöÀÇ ¹®ÀÚ¿À» ¸»ÇÑ´Ù.
º¸Åë »ç¿ëÀÚ¿Í ÄÄÇ»ÅÍ¿Í ´ëÈÇϱâ À§ÇÑ
ÀÔÃâ·ÂÀº Á¤±Ô¸ðµå »óÅ¿¡¼ ÇàÇØÁø´Ù.
ÀÌ»óÅ¿¡¼´Â ¹®ÀÚ¿ ÀÔ·ÂÈÄ Enter ۸¦ ´·¯¾ß ¸®ÅÏÀÌ µÉ°ÍÀÌ´Ù.
(ȤÀº Ctrl+d ¸¦ ´·¯¼ EOF ¸¦ ¹ß»ý½Ãų°æ¿ì)
¶ÇÇÑ Á¤±Ô ¹æ½Ä¿¡¼´Â ERASE¿Í KILL ¹®ÀÚµîÀÌ Çã¿ëµÈ´Ù.
Á¤±Ô¹æ½Ä ÀÚü°¡ ¶óÀδÜÀ§ ÀÔÃâ·ÂÀÛµ¿ÀÓÀ¸·Î ´ç¿¬È÷ Erase, kill ¹®ÀÚ¸¦
»ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
±âº»ÀûÀ¸·Î Å͹̳ÎÀº Á¤±Ô¸ðµå·Î ½ÃÀÛÇÑ´Ù.
ºñÁ¤±Ô¸ðµå¶ó°í ÇÑ´Ù. Á¤±Ô¸ðµå°¡ ¶óÀδÜÀ§·Î ÀÔÃâ·ÂÀ» ó¸®ÇÏ´Â
°Í°ú ´Þ¸® ºñÁ¤±Ô¸ðµå´Â ÇѹÙÀÌÆ®¾¿ ó¸®ÇÏ°Ô µÈ´Ù.
ÇѹÙÀÌÆ®¾¿ ó¸®ÇÏ°Ô µÊÀ¸·Î Á¤±Ô¸ðµå¿¡¼ °¡´ÉÇß´ø ¿©·¯°¡Áö
Ư¼ö¹®ÀÚµé(ERASE, KILL, EOF, NL, CR)À» »ç¿ëÇÒ¼ö ¾ø°Ô µÈ´Ù.
- ´ç¿¬ÇÏ´Ù ÀÌ¹Ì µ¹·ÁÁø ¹®ÀÚ¿¡ ´ëÇØ¼ ERASE µîÀ» ÇÒ¼ö ÀÖÀ» ÅÎÀÌ ¾ø´Ù -
¿¹Á¦ echo_off.c °¡ ºñÁ¤±Ô¸ðµå·Î ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥Àε¥, delete ۵îÀÌ
¸ÔÁö ¾ÊÀ½À» ¾Ë¼ö ÀÖ´Ù. À§¿¡¼ ¸»ÇßµíÀÌ ºñÁ¤±Ô¸ðµå¿¡¼´Â ERASE ¹®ÀÚ°¡
»ç¿ëµÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù. echo_off.c ¸¦ ºñÁ¤±Ô ¸ðµå·Î ÀÛ¼ºÇÑ ÀÌÀ¯´Â
Á¤±Ô¸ðµå·Î ÇÒ°æ¿ì °³Ç๮ÀÚ '\n' ÀÌ ÀԷµDZâ Àü±îÁö´Â ¸®ÅϵÇÁö ¾ÊÀ½À¸·Î
¹ÙÀÌÆ®´ÜÀ§·Î ¸®ÅÏÇϵµ·Ï Çϱâ À§ÇؼÀÌ´Ù.
À§ ¿¹Á¦Äڵ忡¼ new_settings.c_lflag &= (~ICANON); À» ÁÖ¼®Ã³¸® ÇÑ´ÙÀ½¿¡
½ÇÇà½ÃŰ¸é ¿£ÅÍ۸¦ ÀÔ·ÂÇϱâ Àü±îÁö´Â ȸ鿡 "*" ÀÌ Ãâ·ÂµÇÁö ¾ÊÀ½À»
¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.
´ë½Å Delete ¿Í °°Àº ¸î¸î Ư¼ö¹®ÀÚÀÇ Àü´ÞÀÌ °¡´ÉÇÔÀ» ¾Ë¼ö ÀÖ´Ù.
¸ðµç Å͹̳Πµ¥ÀÌŸ´Â ´ÙÀ½ÀÇ 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 µÇ¾îÀÖ´Â »óÅÂÀÌ´Ù.
| | IGNBRK | break ÄÁµð¼ÇÀ» ¹«½ÃÇÑ´Ù.
break ÄÁµð¼ÇÀº ¿¬¼ÓµÈ 0ÀÇ °ªÀ» °¡Áö´Â ºñÆ®·Î Á¤ÀǵȴÙ.
¸¸¾à IGNBRK °¡ on µÇ¾î ÀÖ°í ÀԷµ¥ÀÌŸ¿¡ break ÄÁµð¼ÇÀÌ
Àü´ÞµÈ´Ù¸é ¹«½ÃÇÏ°Ô µÈ´Ù.
| | BRKINT | À̰ÍÀº break ÄÁµð¼Ç »ó¿¡¼ SIGINT ¸¦ °¡·Îä±â À§Çؼ
»ç¿ëµÈ´Ù. ¸¸¾à IGNBRK °¡ off µÇ¾îÀÖ°í, BRKINT°¡
¼¼ÆÃµÇ¾î ÀÖ´Â »óÅ¿¡¼ break ÄÁµð¼ÇÀÌ ÀԷµȴٸé
À̰ÍÀº Ãâ·ÂÄí¿¡ ½×ÀÌ°Ô µÈ´Ù. ¸¸¾à Å͹̳ÎÀÌ
foreground process »óÅ·Πµ¹°í ÀÖ´Â µµÁßÀ̶ó¸é,
SIGINT ½ÅÈ£¸¦ ¹ß»ý½ÃŰ°Ô µÈ´Ù.
| | IGNPAR | parity ¿¡·¯¹«½ÃÇÑ´Ù. | | INPCK | parity üũ¸¦ ½Ç½ÃÇÑ´Ù. | | ISTRIP | ¸¸¾à ÀÌ Ç÷¹±×¸¦ on ½Ã۸é, À¯È¿ÇÑ ÀÔ·Â ¹®ÀÚ¸¦
óÀ½ 7bit ·Î ¼¼ÆÃÇÏ°Ô µÈ´Ù. ±×·¸Áö ¾ÊÀ»°æ¿ì 8bit
ÀÔ·ÂÀ¸·Î ó¸®ÇÑ´Ù.
| | INLCR | NL ¹®ÀÚ(new-line)¸¦ CR(carriage return) ¹®ÀÚ·Î
´ëü½ÃŲ´Ù. ¸¸¾à ÀÌ Ç÷¹±×°¡ on µÈ´Ù¸é, NL ¹®ÀÚ´Â CR
¹®ÀÚ·Î º¯°æµÈ´Ù.
| | IGNCR | CR ¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù. on µÉ°æ¿ì ÀԷµǴ CR ¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù.
(ÀÐÁö ¾Ê´Â´Ù)
| | ICRNL | CR ¹®ÀÚ¸¦ NL ¹®ÀÚ·Î ´ëü½ÃŲ´Ù. IGNCR ÀÌ on µÇ¾î ÀÖÁö ¾ÊÀº
»óÅ¿¡¼ ICRNLÀÌ on µÇ¾î ÀÖÀ»°æ¿ì ¹ÞÀº CR À» NL ·Î º¯°æÇÑ´Ù.
| | IXON | start ¿Í 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) ÀÇ »óÅÂÀÌ´Ù.
| | | | | OPOST | Post-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ÀÌ Àü´ÞµÈ´Ù. | | NLDLY | new-line ¹®ÀÚÁö¿¬ÀÌ´Ù. NL0 °ú NL1 µÎ°³ÀÇ °ªÀÌ ÁغñµÇ¾î ÀÖ´Ù.
NL0 Àº Áö¿¬¾øÀ½À̸ç, NL1 ÀÇ °æ¿ì ¾à 0.1 ÃÊ Á¤µµÀÇ
Áö¿¬½Ã°£ÀÌ »ý±ä´Ù. ¸¸¾à OFILL Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é,
Áö¿¬À» ¸¸µé±â À§Çؼ µÎ°³ÀÇ fill ¹®ÀÚ¸¦ Àü´ÞÇÑ´Ù.
| | CRDLY | CR ¹®ÀÚÁö¿¬ÀÌ´Ù. ¿©±â¿¡´Â 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 | ¼³¸í | Çϵå¿þ¾îÀÇ Å͹̳ÎÁ¦¾î¿¡ °ü·ÃµÈ ¼Ó¼ºµéÀÌ´Ù. ¸ðµ©°ú °°Àº
Çϵå¿þ¾î Á¦¾î¿¡ ¸¹ÀÌ ¾²ÀδÙ.
| | CBAUD | baud 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 ¸¦ ³ªÅ¸³½´Ù.
| | CSTOPB | stop ºñÆ®ÀÇ ¼ö¸¦ Á¤ÇÑ´Ù. ÀÌ Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é 2°³ÀÇ
stop ºñÆ®¸¦ ±×·¸Áö ¾Ê´Ù¸é 1°³ÀÇ stop ºñÆ®¸¦ º¸³½´Ù.
| | CREAD | receiver À» Ȱ¼ºÈÇÑ´Ù.
| | HUPCL | ÀÌ Ç÷¹±×°¡ ¼¼ÆÃµÇ¾î ÀÖ´Ù¸é, ¸¶Áö¸· ÇÁ·Î¼¼½º°¡ Á¾·áµÇ°Å³ª,
¸¶Áö¸· ÇÁ·Î¼¼½ºÀÇ line(ȸ¼±)ÀÌ ´ÝÈú°æ¿ì disconnect °¡
¹ß»ýÇÑ´Ù.
| | PARENB | parity ¸¦ Ãß°¡ÇÑ´Ù. ÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖÀ¸¸é,
parity ¸¦ »ý¼ºÇÏ°í °Ë»öÇÏ°Ô µÈ´Ù. °¢¹®ÀÚ¿¡ parity bit °¡
Ãß°¡µÈ´Ù.
|
표 4. Å͹̳Π¼Ó¼º°ª - c_lflag | ¼³¸í | ·ÎÄÃ(»ç¿ëÀÚ) Å͹̳ο¡ °üÇÑ ¼Ó¼º°ú °ü·ÃµÇ¾î ÀÖ´Ù. ÃʱⰪÀº
¸ðµÎ on »óÅÂÀÌ´Ù.
| | ISIG | signal À» ¹Þ¾ÆµéÀδÙ. ÀÌ Ç÷¹±×°¡ on µÇ¾î ÀÖ´Ù¸é,
INTR, QUIT, SUSP, DSUSP °ú °°Àº Ư¼ö ¹®ÀÚ¸¦ ¹Þ¾ÆµéÀδÙ.
| | ICANON | ÀÌ Ç÷¹±×°¡ onµÇ¸é Á¤±Ô¸ðµå·Î ÀÔ·ÂÀÌ ÀÌ·ç¾îÁø´Ù. | | NOFLSH | queue flush ¸¦ ºñȰ¼ºÈ ½ÃŲ´Ù. | | ECHO | ¹ÝÇâÀ» ¼³Á¤ÇÑ´Ù. ¸¸¾à ÀÌ Ç÷¹±×°¡ off µÇ¾îÀÖ´Ù¸é ÀÔ·ÂÀº ¹ÝÇâµÇÁö ¾Ê´Â´Ù. | | ECHOE | erase ¹®ÀÚ¸¦ ¹ÝÇâÇÑ´Ù. ¸¸¾à ÀÌ Ç÷¹±×¿Í ÇÔ²² ECHO Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é ERASE
°¡ ¹ß»ýÇÒ°æ¿ì ½ºÅ©¸°¿¡¼ ¸¶Áö¸· ¹®ÀÚ¸¦ Áö¿ì°Ô µÈ´Ù.
| | ECHOE | erase ¹®ÀÚ¸¦ ¹ÝÇâÇÑ´Ù. ¸¸¾à ÀÌ Ç÷¹±×¿Í ÇÔ²² ECHO Ç÷¹±×°¡ on µÇ¾îÀÖ´Ù¸é ERASE
°¡ ¹ß»ýÇÒ°æ¿ì ½ºÅ©¸°¿¡¼ ¸¶Áö¸· ¹®ÀÚ¸¦ Áö¿ì°Ô µÈ´Ù.
| | ECHOPRT | ¸¸¾à ECHO Ç÷¡±×°¡ on µÇ¾îÀÖ°í ECHOPRT°¡ on µÇ¾úÀ»°æ¿ì ERASE °¡ ¹ß»ýÇÑ´Ù¸é
(back ½ºÆäÀ̽ºÅ°¸¦ ÀÔ·ÂÇÑ´Ù¸é) »èÁ¦µÇ´Â ¹®ÀÚ°¡ '\' µÚ¿¡ Ç¥½ÃµÇ°Ô µÈ´Ù.
¸¸¾à ¸ðµç ¹®ÀÚ¸¦ »èÁ¦Çß´Ù¸é '/' °¡ Ãâ·ÂµÇ°Ô µÈ´Ù.
| | ECHOKE | Backspace-Space-Backspace entire line on line kill | | ECHONL | NL¹®ÀÚ°¡ ¹ÝÇâµÈ´Ù. 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 ½Ã±×³ÎÀÌ ¹ß»ýµÈ´Ù.
| | VQUIT | Quit Á¦¾î¹®ÀÚ Ctrl+\ ¿Í °ü·ÃµÈ´Ù. ISIG Ç÷¡±×°¡ on µÇ¾î ÀÖ°í Quit Á¦¾î¹®ÀÚ°¡
ÀԷµǸé SIGQUIT ½Ã±×³ÎÀÌ ¹ß»ýÇÑ´Ù.
| | VERASE | ERASE Á¦¾î¹®ÀÚ(¹é½ºÆäÀ̽º) ¿Í °ü·ÃµÈ´Ù. Á¤±Ô¸ðµå(ICANON) Ç÷¡±× °¡ on µÇ¾î
ÀÖ°í, ERASE Á¦¾î¹®ÀÚ°¡ ¹ß»ýÇÏ¸é °¡Àå ¸¶Áö¸· ¹®ÀÚ°¡ Áö¿öÁø´Ù.
| | VKILL | KILL Á¦¾î¹®ÀÚ (Ctrl+u)¿Í °ü·ÃµÈ´Ù. | | VEOF | Ctrl-d Á¦¾î¹®ÀÚ¿Í °ü·ÃµÈ´Ù. ICANON Ç÷¡±×°¡ on µÇ¾î ÀÖ°í, EOF°¡ ¹ß»ýÇϸé
Àб⠴ë±âÁßÀÎ ¸ðµç¹®ÀÚµéÀº °³Ç๮ÀÚ¸¦ ¸¸³ªÁö ¾Ê´õ¶óµµ
¹Ù·Î ÇÁ·Î¼¼½º¿¡°Ô Àü´ÞµÈ´Ù.
| | VSTOP | STOP Á¦¾î¹®ÀÚ(Ctrl+s)¿Í °ü·ÃµÈ´Ù. | | VSUSP | SUSP Á¦¾î¹®ÀÚ (Ctrl+z)¿Í °ü·ÃµÈ´Ù. ISIG Ç÷¡±×°¡ on µÇ¾îÀÖ´Â »óÅ¿¡¼
Ctrl+z °¡ ÀÔ·ÂµÇ¸é ¸ðµç Æ÷±×¶ó¿îµå ÇÁ·Î¼¼½º¿¡ SIGSTOP ½ÅÈ£°¡ Àü´ÞµÈ´Ù.
| | VWERSE | WERASE Á¦¾î¹®ÀÚ (Ctrl+w) ¿Í °ü·ÃµÈ´Ù. |
Å͹̳ÎÀÇ ¼Ó¼ºÀ» º¯°æÇϱâ À§Çؼ´Â ÀÏ´Ü ÇöÀç Å͹̳ÎÀÌ
¼Ó¼ºÀ» ¾ò¾î¿Í¾ß ÇÑ´Ù. ±×¸®°í ³ª¼ º¯°æÇϰíÇ Å͹̳ÎÀÇ ¼Ó¼º°ªÀ»
ºñÆ®¿¬»êÀ» ÀÌ¿ëÇØ¼ on/off½ÃÄÑÁÖ¸é µÈ´Ù.
ÇöÀç Å͹̳ÎÀÇ ¼Ó¼ºÀ» ¾ò¾î¿À±â À§Çؼ tcgetattr ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
ÀÌÇÔ¼ö¸¦ »ç¿ëÇϸé Å͹̳ÎÀÇ ¼Ó¼º°ªÀ» ¾ò¾î¿Í¼ struct termios ±¸Á¶Ã¼¸¦
ä¿îÈÄ µÇµ¹·ÁÁØ´Ù.
int tcgetattr(int fd, struct termios *termios_p);
|
fd ´Â ¼Ó¼ºÀ» ¾Ë±â¸¦ ¿øÇÏ´Â open µÈ ÆÄÀÏ(ÀÏ¹ÝÆÄÀÏ È¤Àº ¹®ÀÚµð¹ÙÀ̽º ÆÄÀÏ) ÀÌ´Ù.
¾Ë¾Æ³½ ¼Ó¼ºÀº termios_p ¿¡ ä¿öÁö°Ô µÈ´Ù.
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
ÇØ´ç ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ ´ëÇÑ ¸ðµç Ãâ·ÂÀÌ Á¾·áµÈ´ÙÀ½ ¼Ó¼ºº¯°æ»çÇ×ÀÌ
Àû¿ëµÈ´Ù. º¯È°¡ ¹ß»ýÇÒ¶§ ÀÐÇôÁöÁö ¾ÊÀº µ¥ÀÌŸ´Â ¹ö·ÁÁø´Ù.
ÀÌ»ó Å͹̳Π¼³Á¤¿¡ °üÇÑ ´Ù¾çÇÑ ³»¿ëµé¿¡ ´ëÇØ¼ ¾Ë¾ÆºÃ´Âµ¥,
¸î°¡Áö ¿¹Á¦¸¦ ÅëÇØ¼ È®½ÇÈ÷ ÀÌÇØ¸¦ ÇØº¸µµ·Ï ÇÏÀÚ.
¿ì¸®´Â À§¿¡¼ 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 ¸¦ ³Ö¾îÁÖ¸é µÈ´Ù.
¿ì¼± 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");
}
}
|
¿äÁò¿¡ ¿Í¼ ´ëºÎºÐÀÇ Å͹̳ÎÀº Å͹̳Π¿¡¹Ä·¹ÀÌÅÍ ¾îÇø®ÄÉÀ̼ÇÀ» ÅëÇØ¼
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 °ú °°Àº Å͹̳Π¿¡¹Ä·¹ÀÌÆ® ÇÁ·Î±×·¥À»
¶ç¿î´ÙÀ½ À§ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í âÀÇ Å©±â¸¦ º¯°æ½Ã۸é¼
Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.
Âü°í·Î ½©»ó¿¡¼ 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 ÀÇ Ãâ·Â°ª°ú
Çѹø ºñ±³ÇØ º¸±â ¹Ù¶õ´Ù.
ÀÌ»ó termios ±¸Á¶Ã¼¿Í À̰ÍÀ» ÀÌ¿ëÇÑ Å͹̳Π¼Ó¼ºº¯°æ¿¡ ´ëÇØ¼
°£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼´Â ÀϹÝÀûÀÎ Å͹̳ÎÀΠŰº¸µå+¸ð´ÏÅ͸¦
±âÁØÀ¸·Î ¼³¸íÇϰí Àִµ¥, ½Ã¸®¾óÅë½ÅÀ» À§ÇÑ Å͹̳Î
¼Ó¼º¿¡ ´ëÇÑ ³»¿ëÀº ºüÁ®ÀÖ´Ù. ÀÌ ³»¿ëµéÀº ½Ã¸®¾óÇÁ·Î±×·¡¹Ö°ü·Ã
°Á¿¡¼ ´Ù·çµµ·Ï ÇϰڴÙ. ¾î¶µç ½Ã¸®¾óÇÁ·Î±×·¡¹Ö ¿ª½Ã ±âº»ÀûÀ¸·Î
À̹®¼¿¡¼ ´Ù·é ³»¿ë¿¡ ¸î°¡Áö´õ Ãß°¡µÇ´Â °ÍÀÓÀ¸·Î, À̹®¼¸¦ ÀÐÀºÈÄ¿¡
½Ã¸®¾óÇÁ·Î±×·¡¹Ö °ü·Ã ¹®¼¸¦ º¸¸é ½±°Ô ÀÌÇØ°¡ µÉ°ÍÀÌ´Ù.
|
|
|
|