¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 58¹ø Á¦ ¸ñ:[moohou] Unix System Programming 6 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:39 ÀÐÀ½:3521 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- _________________________________________________________________________ Unix System Programming 6 - ±è¼ºÈ£(moohou) _________________________________________________________________________ Á¦6Àå. ÇÁ·Î¼¼½º°£ÀÇ Åë½Å : 1 6.1. ¼­·Ð ¼ÒÇÁÆ®¿þ¾î ½Ã½ºÅÛÀ» ±¸¼ºÇÒ¶§ ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó ¿©·¯ °³ÀÇ »óÈ£º¸Á¶ ÀûÀÎ ÇÁ·Î¼¼½º¸¦ ÀÌ¿ëÇØ¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. µÎ °³ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ÀÛ¾÷À» °øµ¿À¸·Î ¼öÇàÇÏ·Á¸é ÀڷḦ °øÀ¯ÇØ¾ß ÇÑ´Ù. À̸¦ À§ÇÑ ÇѰ¡Áö ¹æ¹ýÀº È­ÀÏÀ» °øÀ¯ÇÏ´Â °ÍÀÌ´Ù. UNIX ¿¡´Â ´Ù¾çÇÑ ÇÁ·Î¼¼½º°£ Åë½Å¹æ½ÄÀÌ Á¸ÀçÇÑ´Ù. ÀÌÀå¿¡¼­´Â °¡Àå ¸¹ÀÌ ¾²ÀÌ´Â ¼¼°¡Áö ¹æ¹ýÀÎ ½Ã±×³Î, ÆÄÀÌÇÁ, FIFO ¸¦ ¼Ò°³ÇÑ ´Ù. 6.2. ½Ã±×³Î 6.2.1. °³°ü ½Ã±×³ÎÀ» ÀÌ¿ëÇϸé UNIX ÇÁ·Î¼¼½º¿¡ ¼ÒÇÁÆ®¿þ¾î ÀÎÆ®·´Æ®¸¦ °£´ÜÈ÷ Àü¼ÛÇÒ ¼ö ÀÖ´Ù. Ư¼º»óÀ¸·Î º¼¶§ ½Ã±×³ÎÀº ÇÁ·Î¼¼½º°£¿¡ ÀڷḦ Àü¼ÛÇϴµ¥ º¸´Ù´Â ºñÁ¤ »óÀûÀÎ »óȲÀ» ó¸®Çϴµ¥ ´õ¿í ÀûÇÕÇÏ´Ù. ½Ã±×³Î À̸§ ½Ã±×³Î À̸§µéÀº #define ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© Ç¥ÁØÇì´õÈ­ÀÏÀÎ signal.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. UNIX ¿¡¼­ Á¦°øµÇ´Â ½Ã±×³ÎµéÀº ¸î°³¸¦ Á¦¿ÜÇϰí´Â ´ëºÎºÐ Ä¿³Î ¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. SIGHUP : hangup ½Ã±×³Î. ÀÌ ½Ã±×³ÎÀº Á¦¾î´Ü¸»±âÀÇ ¿¬°áÀÌ ²÷¾îÁ³À» ¶§ Ä¿ ³Î¿¡ ÀÇÇÏ¿© ±× ´Ü¸»±â¿¡ ¿¬°áµÈ ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. SIGINT : interrupt. ÀÌ ½Ã±×³ÎÀº »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ®Å°¸¦ Ä¥ ¶§ Ä¿³Î¿¡ ÀÇ ÇÏ¿© ´Ü¸»±â¿Í ¿¬°áµÈ ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. À̰ÍÀº ¼öÇàÁß ÀÎ ÇÁ·Î±×·¥À» ÁßÁö½ÃŰ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀÌ´Ù. SIGQUIT : quit. ÀÌ ½Ã±×³ÎÀº SIGINT ¿Í ¸¶Âù°¡Áö·Î »ç¿ëÀÚ°¡ ´Ü¸»±â¿¡¼­ Á¾·á(quit)۸¦ Ä¥¶§ Ä¿³Î¿¡ ÀÇÇÏ¿© º¸³»Áø´Ù. Á¾·áŰÀÇ ÀϹÝÀûÀÎ °ªÀº ASCII FS ¶Ç´Â CTRL-\ ÀÌ´Ù. SIGILL : illegal Instruction. ÀÌ ½Ã±×³ÎÀº ºñÁ¤»óÀûÀÎ ¸í·ÉÀÌ ¼öÇàµÇ·Á ÇÒ ¶§ ¿î¿µÃ¼Á¦·ÎºÎÅÍ º¸³»Áø´Ù. SIGTRAP : trace trap. À̰ÍÀº ptrace ½Ã½ºÅÛ°ú ÇÔ²² sdb µÂ adb µîÀÇ µð¹ö °Å¿¡ ÀÇÇÏ¿© »ç¿ëµÇ´Â Ưº°ÇÑ ½Ã±×³ÎÀÌ´Ù. SIGFPE : floating-point exception. À̰ÍÀº ¿À¹öÇ÷ο쳪 ¾ð´õÇÆ·Î¿ì °°Àº ºÎµ¿ ¼Ò¼ýÁ¡ ¿À·ù°¡ ¹ß»ýÇßÀ» ¶§ Ä¿³Î¿¡ ÀÇÇÏ¿© º¸³»Áø´Ù. SIGKILL : kill. À̰ÍÀº ÇÁ·Î¼¼½º·ÎºÎÅÍ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ Á¾·á½Ã۱â À§ÇÏ ¿© º¸³»Áö´Â Á¶±Ý Ưº°ÇÑ ½Ã±×³ÎÀÌ´Ù. SIGSYS : bad arguments to a system call. À̰ÍÀº ÇÁ·Î¼¼½º°¡ Á¤»óÀûÀÎ ½Ã ½ºÅÛ È£Ãâ ¿À·ù º¹±¸ ¹æ½Ä¿¡ ÀÇÇÏ¿© ó¸®µÉ ¼ö ¾ø´Â ºÎÀûÀýÇÑ ÀÎ ¼ö¸¦ ½Ã½ºÅÛ È£Ãâ¿¡ º¸³ÂÀ» ¶§ Ä¿³Î¿¡ ÀÇÇÏ¿© º¸³»Áø´Ù. SIGPIPE : write on a pipe with no-one to read it. ÆÄÀÌÇÁ´Â 6.3.Àý¿¡¼­ ´Ù·ç¾îÁú ¶Ç ÇϳªÀÇ ÇÁ·Î¼¼½º°£ Åë½Å ¹æ½ÄÀÌ´Ù. SIGALRM : alarm clock. À̰ÍÀº ŸÀ̸Ӱ¡ ¸¸·áµÇ¾úÀ» ¶§ Ä¿³Î¿¡ÀÇÇÏ¿© ÇÁ·Î ¼¼½º¿¡ º¸³»Áø´Ù. SIGTERM : software termination. ÀÌ ½Ã±×³ÎÀº º¸ÅëÀÇ ÇÁ·Î±×·¥¿¡ ÀÇÇÏ¿© »ç¿ëµÉ ¼ö ÀÖµµ·Ï Á¦°øµÇ´Â °ÍÀÌ´Ù. SIGUSR1 & SIGUSR2 : SIGTERM °ú ¸¶Âù°¡Áö·Î À̰͵éÀº Ä¿³Î¿¡ ÀÇÇÏ¿© »ç¿ë µÇ´Â°ÍÀÌ ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ ¿øÇÏ´Â ¸ñÀûÀ»À§ÇÏ¿© »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ ¹Û¿¡µµ ±¸ÇöµÈ ¹æ½Ä¿¡ µû¶ó ¿©·¯°¡Áö ½Ã±×³ÎÀÌ ÀÖ´Â µ¥ À̵é Áß ´ëºÎºÐÀº Ä¿³ÎÀÌ ¿À·ù»óŸ¦ ³ªÅ¸³»´Â µ¥ »ç¿ëµÈ´Ù. ±¸Çö¹æ¹ý¿¡ µû¶ó ´Ù¸£°Ô ÀÛµ¿ÇÏ´Â ½Ã±×³Î Áß °¡Àå Áß¿äÇÑ °ÍÀº SIGCLD(death of a child) ½Ã±×³ÎÀÌ´Ù. À̰ÍÀº ÃÖ ±ÙÀÇ UNIX ½Ã½ºÅÛ¿¡¼­ exit ¿Í wait ½Ã½ºÅÛ È£ÃâÀ» ±¸ÇöÇϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù. SIGCLD ´Â exit °¡ ¼öÇàµÉ¶§ ±× ÇÁ·Î¼¼½ºÀÇ ºÎ¸ðÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. Á¤»ó°ú ºñÁ¤»ó Á¾·á ´ëºÎºÐÀÇ ½Ã±×³ÎÀº ±× ½Ã±×³ÎÀÌ ¹Þ¾ÆÁ³À» ¶§ Á¤»óÁ¾·á°¡ µÈ´Ù. À̰ÍÀº ÇÁ·Î ¼¼½º°¡ »çÀüÁغñ ¾øÀÌ exit È£ÃâÀ» ¼öÇàÇÑ °Í°ú °°Àº È¿°úÀÌ´Ù. SIGQUIT, SIGILL, SIGTRAP, SIGSYS, SIGFPE µîÀÇ ½Ã±×³ÎÀº ºñÁ¤»ó Á¾·á»óŸ¦ ÃÊ·¡Çϰí ÀÌ È¿°ú´Â ÄھƴýÇÁ·Î ³ªÅ¸³­´Ù. UNIX µð¹ö°Å sdb ¿Í adb ´Â ÄÚ¾ÆÈ­ÀÏÀÇ Çü½Ä À» ¾Ë°í À־, ÄÚ¾Æ ´ýÇÁµÈ ¼ø°£ÀÇ ÇÁ·Î¼¼½º »óŸ¦ ¾Ë¾Æº¸´Â µ¥ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¿©±â¼­ abort ·çƾÀ» »ìÆìº¸´Â °Íµµ ÀǹÌÀÖ´Â ÀÏÀÌ´Ù. abort(); abort ´Â ¹«¾ùÀΰ¡ À߸øµÆÀ» ¶§ ÇÁ·Î¼¼½º°¡ ÇöÀç »óŸ¦ ±â·ÏÇÒ ¼ö ÀÖµµ·Ï ÇϹǷΠ¾ÆÁÖ À¯¿ëÇÑ µð¹ö±ë µµ±¸ÀÌ´Ù. À̰ÍÀº ¶ÇÇÑ ÇÁ·Î¼¼½º°¡ ÀÚ±âÀڽſ¡°Ô ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. 6.2.2. signal ½Ã½ºÅÛÈ£ÃâÀ» ÀÌ¿ëÇÑ ½Ã±×³Îó¸® #include int func(), (*was)(), sig; . . was = signal(sig, func); ù¹øÂ° Àμö sig ´Â ´ë»óÀÌ µÇ´Â ½Ã±×³ÎÀ» ÁöÁ¤ÇÑ´Ù. signal ÀÌ È¿°ú¸¦ ¹ßÈÖ Çϱâ À§Çؼ­´Â ´ë»óÀÌ µÇ´Â ½Ã±×³ÎÀÌ µµ´ÞÇϱâ Àü¿¡ È£ÃâÀÌ ¼öÇàµÇ¾î¾ß ÇÑ´Ù. SIGKILL À» Á¦¿ÜÇϰí´Â ¾Õ¿¡¼­ Á¤ÀÇÇÑ ¾î¶² ½Ã±×³Îµµ sig °¡ µÉ ¼ö ÀÖ´Ù. SIGKILL Àº ¾î¶² °æ¿ì¿¡µµ ÇÁ·Î¼¼½º¸¦ Á¾·á½Ãų ¼ö ÀÖµµ·Ï Çϱâ À§ÇÏ¿© Á¦¿ÜµÇ ¾ú´Ù. signal ÀÇ µÎ¹øÂ° Àμö func ´Â ½Ã±×³Î¿¡ ´ëÇÑ Ã³¸®¸¦ ³ªÅ¸³½´Ù. À̰ÍÀº ¼¼°¡Áö °ªÀ» °¡Áú¼ö ÀÖ´Ù. 1. Á¤¼ö°ªÀ» µ¹·ÁÁÖ´Â ÇÔ¼öÀÇ ÁÖ¼Ò. 2. SIG_IGN ½Ã±×³ÎÀ» ¹«½ÃÇ϶ó´Â ÀǹÌÀÇ Æ¯º°ÇÑ ±âÈ£ À̸§. ÇÁ·Î¼¼½º´Â sig ÇüÀÇ ½Ã±×³ÎÀ» ¸ðµÎ ¹«½ÃÇÑ´Ù. 3. SIG_DFL ½Ã½ºÅÛÀÇ ¹¬½ÃÀû(default) ó¸® »óÅ·Πº¹¿øÇÏ´Â ±âÈ£À̸§. ¸ðµç Ç¥ÁØ ½Ã±×³Î¿¡ ´ëÇÏ¿© À̰ÍÀº Á¤»ó ¶Ç´Â ºñÁ¤»ó Á¾·á¸¦ ÀǹÌÇÑ´Ù. 6.2.3. ½Ã±×³Î°ú ½Ã½ºÅÛ È£Ãâ ´ëºÎºÐÀÇ °æ¿ì ÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛ È£ÃâÀ» ¼öÇàÇÏ´Â µµÁß¿¡ ½Ã±×³ÎÀÌ µµÂøÇÏ ¸é, ½Ã±×³ÎÀº ½Ã½ºÅÛ È£ÃâÀÌ Á¾·áÇÒ ¶§±îÁö ¾Æ¹«·± ¿µÇâÀ» ¹ÞÁö¾Ê´Â´Ù. ±×·¯³ª ¸î¸î ½Ã½ºÅÛ È£ÃâµéÀº ´Ù¸£°Ô 󸮵Ǵµ¥, À̵éÀº ½Ã±×³Î¿¡ À¸ÇÏ¿© ÀÎÅÍ·´Æ® ¸¦ ¹Þ´Â´Ù. ÀÌ·± È£ÃâµéÀº ´À¸° ÀåÄ¡(µð½ºÅ© È­ÀÏÀÌ ¾Æ´Ï¶ó ´Ü¸»±â¿Í °°Àº °Í µé)¿¡ ´ëÇÑ read, write ¶Ç´Â open, wait ¶Ç´Â pause È£ÃâÀÌ´Ù. if(write(tfd, buf, SIZE) < 0){ if(errno == EINTR){ warn("Write interrupted"); . . } } 6.2.4. ½Ã±×³Î ÀçÁöÁ¤ ´ëºÎºÐÀÇ ½Ã±×³Î(SIGILL °ú SIGTRAP Àº Á¦¿Ü)¿¡ ´ëÇÑ Ã³¸® ÇÔ¼ö´Â ½Ã±×³ÎÀÌ Æ÷ÂøµÈ ÈÄ Áï½Ã ÀçÁöÁ¤µÈ´Ù. /* reset -- signal example */ #include int interrupt() { printf("Interrupt called\n"); sleep(10); } main() { signal(SIGINT, interrupt); printf("Interrupt set for SIGINT\N"); sleep(10); } ÇÁ·Î±×·¥Àº ¿ì¼± ½Ã±×³Î SIGINT ÀÇ Ã³¸®ÇÔ¼ö·Î interrupt ¸¦ ÁöÁ¤Çϰí, ¸Þ½Ã Áö¸¦ Ãâ·ÂÇÑ ÈÄ 10 ÃÊ µ¿¾È Á¤ÁöÇÑ´Ù. ¸¸¾à »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ® ۸¦ ´©¸£¸é, interrupt°¡ ¼öÇàµÇ¸é¼­ ´Ù¸¥ ¸Þ½ÃÁö°¡ Ãâ·ÂµÇ°í sleepÀÌ µÎ¹øÂ°·Î ¼öÇàµÈ´Ù. ±×·¯³ª ¸¸¾à ÀÎÅÍ·´Æ® ۰¡ ¶Ç ´Ù½Ã ´­·¯Áö¸é ÇÁ·Î¼¼½º´Â Á¾·áÇÑ´Ù. UNIX ½Ã±× ³ÎÀº ´©ÀûµÇÁö ¾Ê´Â ´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó. ´Ù½Ã ¸»Çϸé ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇÏ ¿© ÇÑ ¼ø°£¿¡´Â °°Àº Á¾·ùÀÇ ½Ã±×³ÎÀÌ ¿ÀÁ÷ Çϳª¸¸ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é¿¡ ¿© ·¯ Á¾·ùÀÇ ½Ã±×³ÎÀº µ¿½Ã¿¡ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. 6.2.5. kill ¸¦ ÀÌ¿ëÇÑ ½Ã½º³Î Àü¼Û ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º°¡ º¸³½ ½Ã±×³ÎÀ» ó¸®Çϱâ À§ÇÏ¿© signal À» È£Ãâ ÇÑ´Ù. ½Ã±×³ÎÀ» º¸³»´Â ÀÛ¾÷Àº kill ½Ã½ºÅÛ È£ÃâÀ» ÅëÇÏ¿© ÀÌ·ç¾îÁø´Ù. #include int pid, sig, retval; . . retval = kill(pid, sig); ù¹øÂ° Àμö pid ´Â ½Ã±×³Î sig °¡ º¸³»Áú ÇÁ·Î¼¼½ºµéÀ» °áÁ¤ÇÑ´Ù. kill(1234, SIGTERM); ÇÁ·Î¼¼½º ¹øÈ£°¡ 1234 ÀÎ ÇÁ·Î¼¼½º¿¡ SIGTERM ½Ã±×³ÎÀ» º¸³»´Â °ÍÀ» ÀǹÌÇÑ ´Ù. ÇÁ·Î¼¼½º´Â ÀÚ±âÀڽſ¡°Ôµµ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Ù. kill ÀÇ pid Àμö´Â Ưº°ÇÑ Àǹ̸¦ °¡Áö´Â ´Ù¸¥ °ªµéÀÌ µÉ ¼öµµ ÀÖ´Ù. ´ÙÀ½Àº °¡´ÉÇÑ ³×°¡Áö¸¦ ³ª ¿­ÇÑ °ÍÀÌ´Ù. 1. pid °¡ 0 ÀÌ¸é ½Ã±×³ÎÀº º¸³»´Â ÇÁ·Î¼¼½º¿Í °°Àº ÇÁ·Î¼¼½º ±×·ë¿¡ ¼ÓÇÏ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. 2. pid °¡ -1 À̰í ÇÁ·Î¼¼½ºÀÇ À¯È¿»ç¿ëÀÚ ½Ä º°¹øÈ£°¡ ½´ÆÛ»ç¿ëÀÚ°¡ ¾Æ´Ï¸é ½Ã±×³ÎÀº ½Ç»ç¿ëÀÚ ½Äº°¹øÈ£°¡ º¸³»´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿»ç¿ëÀÚ ½Äº°¹øÈ£¿Í °°Àº ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. ¿©±â¿¡´Â º¸³»´Â ÇÁ·Î¼¼½ºµµ Æ÷ÇԵȴÙ. 3. pid °¡ -1 À̰í À¯È¿»ç¿ëÀÚ ½Äº°¹øÈ£°¡ ½´ÆÛ»ç¿ëÀÚÀÌ¸é ½Ã±×³ÎÀº Ư¼öÇÑ ½Ã½ºÅÛÇÁ·Î¼¼½º¸¦ Á¦¿ÜÇÑ ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù.(Ư¼öÇÑ ½Ã½ºÅÛ ÇÁ·Î ¼¼½º¸¦ Á¦¿ÜÇÏ´Â °ÍÀº ÇÁ·Î¼¼½ºÀÇ ±×·ì¿¡ ½Ã±×³ÎÀ» º¸³»´Â °æ¿ì¿¡´Â ¸ðµÎ ÇØ´çµÇ´Âµ¥ ¿©±â¼­´Â ƯÈ÷ Áß¿äÇÏ´Ù.) 4. ¸¶Áö¸·Àº pid °¡ 0 º¸´Ù ÀÛÀ¸¸é¼­ -1 ÀÌ ¾Æ´Ñ °æ¿ì·Î ½Ã±×³ÎÀº ÇÁ·Î¼¼½ºÀÇ ±×·ì ½Äº° ¹øÈ£°¡ pid ÀÇ Àý´ë°ª°ú °°Àº ¸ðµç ÇÁ·Î¼¼½º º¸³»Áø´Ù. À̰ÍÀº ¶§¶§·Î º¸³»´Â ÇÁ·Î¼¼½º¸¦ Æ÷ÇÔÇÑ´Ù. 6.2.6. alarm ½Ã½ºÅÛ È£Ãâ alarm Àº ÇÁ·Î¼¼½ºÀÇ ¾Ë¶÷½Ã°è¸¦ Á¶ÀÛÇÏ´Â °£´ÜÇÏ°íµµ À¯¿ëÇÑ ½Ã½ºÅÛ È£ÃâÀÌ ´Ù. ŸÀ̸Ӱ¡ Á¾·áµÈ °ÍÀ» ÇÁ·Î±×·¥¿¡ ¾Ë·ÁÁÖ±â À§ÇÏ¿© ½Ã±×³ÎÀÌ »ç¿ëµÈ´Ù. unsigned int remain, secs; . . remain = alarm(secs); secs ´Â ½Ã°£À» ÃÊ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù. alarm Àº ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀ» ÁßÁö½ÃŰ´Â sleep °ú´Â ´Ù¸£´Ù. alarm Àº ´ë½Å¿¡ Áï½Ã º¹±ÍÇÏ¿© SIGALRM ½Ã±×³ÎÀÌ µµÂøÇÒ ¶§±îÁö Á¤»óÀûÀ¸·Î ¼öÇàÀ» °è¼ÓÇÑ´Ù. ÀÛµ¿ÁßÀÎ ¾Ë¶÷½Ã°è´Â exec È£ÃâÀÌ ¼öÇàµÇ ´õ¶óµµ °è¼ÓÇØ¼­ ÀÛµ¿ÇÑ´Ù.(±×·¯³ª, fork ¸¦ ¼öÇàÇÑ ÈÄ ¿¡ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ¾Ë¶÷½Ã°è´Â ´õÀÌ»ó ÀÛµ¿ ÇÏÁö ¾Ê´Â´Ù.) ¾Ë¶÷Àº 0 À» Àμö·Î ÇÏ´Â alarm À» È£ ÃâÇϸé Ãë¼ÒµÈ´Ù. /* turn alarm clock off */ alarm(0); 6.2.7. pause ½Ã½ºÅÛ È£Ãâ UNIX ´Â alarm °ú °°Àº ºÎ·ùÀÎ pause ½Ã½ºÅÛ È£ÃâÀ» Á¦°øÇÑ´Ù. int retval; retval = pause(); pause ¸¦ È£ÃâÇÑ ÇÁ·Î¼¼½º´Â SIGALRM µîÀÇ ½Ã±×³ÎÀÌ µµÂøÇÒ ¶§±îÁö ½Ã½ºÅÛ ÀÚ ¿øÀ» ³¶ºñÇÏÁö ¾Êµµ·Ï ¼öÇàÀÌ ÁßÁöµÈ´Ù. 6.2.8. setjmp ¿Í longjmp ¶§¶§·Î ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ ÇÁ·Î±×·¥À» ÀÌÀüÀÇ »óÅ·Πº¹±¸Çá¿©¾ß ÇÒ ¶¼°¡ ÀÖ ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ® ۸¦ Ä¡¸é ÇÁ·Î±×·¥ÀÇ ÁÖ¸Þ´º·Î µ¹¾Æ°¡°Ô ÇØ ¾ß ÇÑ´Ù°í ÇÏÀÚ. À̰ÍÀº µÎ°³ÀÇ Æ¯¼öÇÑ ¼­ºê·çƾ setjmp ¿Í longjmp ¸¦ ÀÌ¿ëÇÏ ¿© ó¸®µÉ ¼ö ÀÖ´Ù. setjmp ´Â ÇÁ·Î±×·¥ÀÇ ÇöÀç »óŸ¦ ÀúÀåÇϰí (»ç½Ç ½ºÅÃÀÇ ³»¿ëÀ» ÀúÀåÇÑ´Ù). longjmp ´Â ÀúÀåµÈ »óŸ¦ ´Ù½Ã º¹±¸ÇÑ´Ù. /* example use of setjmp and longjmp */ #include #include #include jmp_buf position; main() { int goback(); . . /* save current position */ setjmp(position); signal(SIGINT, goback); domenu(); . . } goback() { signal(SIGINT, SIG_IGN); fprintf(stderr, "\nInterrupted\n"); /* go back to saved position */ longjmp(position, 1); } signal ÀÌ ¼öÇàµÈ ÈÄ¿¡ »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ® ۸¦ Ä¡¸é, ¿ì¼± goback ÀÌ ¼öÇàµÈ ´Ù. goback Àº longjmp ¸¦ È£ÃâÇϰí, setjmp °¡ ÀúÀåÇÑ ÇÁ·Î±×·¥ À§Ä¡·Î Á¦¾î ¸¦ Àü´ÞÇÑ´Ù. µû¶ó¼­ ÇÁ·Î±×·¥Àº ¹æ±Ý setjmp ¿¡¼­ º¹±ÍÇÑ °Íó·³ ¼öÇàÀÌ °è¼Ó µÈ´Ù. ÀÌ °æ¿ì¿¡ setjmp ÀÇ º¹±Í°ªÀº longjmp ÀÇ µÎ¹øÂ° Àμö°¡ µÈ´Ù. 6.3. ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ Åë½Å ÆÄÀÌÇÁ´Â ÇÁ·Î¼¼½º¸¦ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ¿¬°á½ÃÄÑ ÁÖ´Â ÀϹæÅëÇØÀÇ Åë½Åä³Î·Î UNIX ÀÇ È­ÀÏ °³³ä À» ÀϹÝÈ­ ÇÑ °ÍÀÌ´Ù. ÇÁ·Î¼¼½º´Â write ½Ã½ºÅÛ È£ÃâÀ» ÀÌ ¿ëÇÏ¿© ÀڷḦ ÆÄÀÌÇÁ¸¦ ÅëÇÏ¿© º¸³¾ ¼ö ÀÖ°í, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ read ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ÀÌ ÀڷḦ ÀоîµéÀÏ ¼ö ÀÖ´Ù. 6.3.1. ¸í·É¾î ¼öÁØ¿¡¼­ÀÇ ÆÄÀÌÇÁ ´ëºÎºÐÀÇ UNIX »ç¿ëÀÚ´Â ¸í·É¾î ¼öÁØ¿¡¼­ ÆÄÀÌÇÁ¸¦ Á¢Çغ¸¾ÒÀ» °ÍÀÌ´Ù. $pr doc | lp À» ¼öÇàÇÏ¸é ½©Àº ¸í·É¾î pr °ú lp ¸¦ µ¿½Ã¿¡ ½ÃÀÛÇÑ´Ù. ¹®ÀÚ '|' ´Â pr ÀÇ Ç¥ÁØ Ãâ·Â°ú lp ÀÇ Ç¥ÁØÀÔ·ÂÀ» ¿¬°áÇÏ´Â ÆÄÀÌÇÁ¸¦ ÀǹÌÇÑ´Ù. ÆÄÀÌÇÁ, ƯÈ÷ ¸ê ·É¾î ¼öÁØ¿¡¼­ÀÇ ÆÄÀÌÇÁ´Â UNIX ÀÇ °¡Àå °­·ÂÇÏ°í ´«¿¡ µÎµå·¯Áö´Â Ư¡ ÁßÀÇ ÇϳªÀÌ´Ù. ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÏ¸é ¿©·¯ ¸í·É¾îµéÀ» °£´ÜÈ÷ Çϳª·Î ¿¬°áÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ UNIX ÇÁ·Î±×·¥µéÀº Ç¥ÁØÀԷ°ú Ç¥ÁØÃâ·ÂÀ» ÀÔ.Ãâ·ÂÀ¸·Î Çϰí Àß Á¤ÀÇ µÈ ÇϳªÀÇ ÀÛ¾÷À» ó¸®ÇÏ´Â ÀϹÝÀûÀÎ µµ±¸·Î °³¹ßµÉ ¼ö ÀÖ´Ù. 6.3.2. ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö ÇÁ·Î±×·¥¿¡¼­ ÆÄÀÌÇÁ´Â pipe ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ¸¸µé¾îÁø´Ù. ½Ã½ºÅÛ È£ ÃâÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, µÎ°³ÀÇ È­Àϱâ¼ú¾î°¡ ¾ò¾îÁø´Ù. ±×Áß Çϳª´Â ÆÄÀÌ ÇÁ¿¡ ¾²±â À§ÇÑ °ÍÀÌ°í ´Ù¸¥ Çϳª´Â ÆÄÀÌÇÁ·ÎºÎÅÍ Àбâ À§ÇÑ °ÍÀÌ´Ù. int filedes[2], retval; retval = pipe(filedes); filedes ´Â ÆÄÀÌÇÁ¸¦ ½Äº°ÇÏ´Â È­Àϱâ¼ú¾î¸¦ ÀúÀåÇÏ´Â Å©±â°¡ 2 ÀÎ Á¤¼ö ¹è¿­ ÀÌ´Ù. È£ÃâÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, filedes[0] ´Â ÆÄÀÌÇÁ·ÎºÎÅÍ ÀÔ·ÂÀ» ¾òÀ» ¼ö ÀÖµµ·Ï °³¹æµÇ°í, filedes[1] Àº ÆÄÀÌÇÁ¿¡ Ãâ·ÂÇÒ ¼ö ÀÖµµ·Ï °³¹æµÈ´Ù. ÆÄ ÀÌÇÁ´Â ÀڷḦ first-in-first-out(FIFO)¿¡ ±Ù°ÅÇÏ¿© ó¸®ÇÑ´Ù. ´Ù½Ã ¸»Çϸé, ÆÄÀÌÇÁ¿¡ ¸ÕÀú ¾²¿©Áø °ÍÀÌ ÆÄÀÌÇÁ·ÎºÎÅÍ ¸ÕÀú ÀÐÇôÁø´Ù. ÀÌ ¼ø¼­´Â lseek ÀÌ ÆÄÀÌÇÁ¿¡´Â Àû¿ëµÇÁö ¾Ê±â ¶§¹®¿¡ º¯È­µÉ ¼ö ¾ø´Ù. ÆÄÀÌÇÁÀÇ ÁöÁ¤ÇÑ °¡Ä¡´Â fork ½Ã½ºÅÛÈ£Ãâ°ú ÇÔ²² »ç¿ëµÉ ¶¼ ¹ßÈֵȴÙ. À̶§ È­Àϱâ¼ú¾î´Â fork °¡ ¼öÇà µÈ ÈÄ¿¡µµ °è¼Ó À¯È¿Çϴٴ Ư¼ºÀÌ ÀÌ¿ëµÈ´Ù. 6.3.3. ÆÄÀÌÇÁÀÇ Å©±â Çö½ÇÀûÀ¸·Î ÆÄÀÌÇÁÀÇ Å©±â´Â À¯ÇÑÇÏ´Ù. ´Ù½Ã ¸»Çϸé ÀÏÁ¤ÇÑ Çѵµ³»ÀÇ ÀڷḸ ÀÌ ÀÐÈ÷Áö ¾ÊÀº »óÅ·ΠÆÄÀÌÇÁ¿¡ ³²¾Æ ÀÖÀ» ¼ö ÀÖ´Ù. ÀÌ Çѵµ´Â ÀϹÝÀûÀ¸·Î 5120 ¹ÙÀÌÆ®ÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡´Â ÀÌ Çѵµ°¡ ÃæºÐÇÏÁö¸¸, ÀÌ ÃÖ´ë Å©±â´Â read ¿Í write ÀÇ ¼öÇà°ú °ü°è°¡ ÀÖ´Ù. ÆÄÀÌÇÁÀÇ ¿ë·®À» ÃʰúÇÏ´Â write °¡ ½Ã µµµÇ¸é ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© ÀÚ·á°¡ ÀÐÇôÁ® ÆÄÀÌÇÁ¿¡ ÃæºÐÇÑ °ø °£ÀÌ ¸¶·ÃµÉ ¶§±îÁö ¼öÇàÀÌ ÁߴܵȴÙ. 6.3.4. ÆÄÀÌÇÁ ´Ý±â ÆÄÀÌÇÁÀÇ ÇÑÂÊ ³¡À» ³ªÅ¸³»´Â È­Àϱâ¼ú¾î°¡ ´ÝÈ÷´Â °æ¿ì¿¡´Â ¾î¶²ÀÏÀÌ »ý±æ ±î? 1. ¾²±âÀü¿ë È­Àϱâ¼ú¾î¸¦ ´Ý¾ÒÀ» ¶§. ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀڷḦ ¾²±â À§ÇØ ÇØ ´ç ÆÄÀÌÇÁ¸¦ °³¹æÇÑ °æ¿ì¿¡´Â ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. 2. ÀбâÀü¿ë È­Àϱâ¼ú¾î¸¦ ´Ý¾ÒÀ» ¶§. ÀڷḦ ÀбâÀ§ÇØ ÇØ´ç ÆÄÀÌÇÁ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º°¡ ÀÖ´Â °æ¿ì¿¡´Â ¾Æ¹« Àϵµ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ÆÄÀÌÇÁ·ÎºÎ ÅÍ ÀڷḦ ÀоîµéÀÌ´Â ÇÁ·Î¼¼½º°¡ ´õ ÀÌ»ó ¾øÀ¸¸é ±× ÆÄÀÌÇÁ¿¡ ÀڷḦ ¾µ ¼ö Àֱ⸦ ±â´Ù¸®´ø ¸ðµç ÇÁ·Î¼¼½º´Â Ä¿³Î·Î ºÎÅÍ SIGPIPE ½Ã±×³ÎÀ» ¹Þ´Â ´Ù. 6.3.5. ºí·°µÇÁö ¾Ê´Â read ¿Í write ÆÄÀÌÇÁ¿¡ ´ëÇÑ read ¿Í write °¡ ¾î¶² °æ¿ì¿¡µµ ºí·¯µÇÁö ¾Êµµ·Ï ÇÏ´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ù¹øÂ° ¹æ¹ýÀº ÆÄÀÌÇÁ¿¡ ´ëÇÑ fstat ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ ¹ýÀº ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ·ÎºÎÅÍ ÀڷḦ ÀоîµéÀÌ´Â °æ¿ì¿¡ Àû´çÇÏ´Ù. µÎ ¹øÂ° ¹æ¹ýÀº fcntl À» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. fcntl ÀÇ ±â´É Áß¿¡´Â ÇÁ·Î¼¼½º°¡ È­ ÀÏ ±â¼ú¾î ÀÇ O_NDELAY Ç÷¡±×¸¦ 1 ·Î ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀº ÆÄÀÌ ÇÁ¿¡ ´ëÇÑ read ¿Í write °¡ ºí·°µÇÁö ¾Êµµ·Ï ÇÑ´Ù. #include . . if(fcntl(filedes, F_SETFL, O_NDELAY) < 0) perror("fcntl"); 6.3.6. ÆÄÀÌÇÁ¿Í exec ½Ã½ºÅÛ È£Ã⠵ΠÇÁ·Î±×·¥À» ½© ¼öÁØ¿¡¼­ ¿¬°áÇϱâ À§ÇÏ¿© ÆÄÀÌÇÁ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. $ls | ws ½©Àº °³¹æµÇ¾î ÀÖ´Â È­Àϱâ¼ú¾î°¡ exec È£ÃâÀ» ¼öÇàÇÑ ÈÄ¿¡µµ ¿©ÀüÈ÷ °³¹æµÇ ¾î ÀÖ´Ù´Â °ÍÀ» ÀÌ¿ëÇÑ´Ù. exec ¸¦ ¼öÇàÇϱâ Àü¿¡ ½©Àº ls ÀÇ Ç¥ÁØÃâ·ÂÀ» ÆÄÀÌ ÇÁÀÇ ¾²±âºÎºÐ¿¡ ¿¬°á½Ã۰í, wc ÀÇ Ç¥ÁØ ÀÔ·ÂÀ» ÀбâºÎºÐ¿¡ ¿¬°á½ÃŲ´Ù. ÀÌ°Í Àº fcntl À» ÀÌ¿ëÇÏ¿© ÀÌ·ç¾îÁö°Å³ª dup È£ÃâÀ» ÀÌ¿ëÇÏ¿© ÀÌ·ç¾îÁø´Ù. dup Àº ´ÙÀ½°ú °°ÀÌ È£ÃâµÈ´Ù. dup(filedes); ÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é dup ´Â filedes ¿Í °°Àº È­ÀÏÀ» °¡¸®Å°´Â »õ·Î¿î È­ Àϱâ¼ú¾î¸¦ µ¹·Á ÁØ´Ù. /* close down standard output */ close(1); /* dup will now return "1" */ dup(filedes); . . /* program will now write its standard */ /* output to the file referred to by */ /* filedes */ . . 6.4. FIFO ¶Ç´Â ¸í¸íµÈ ÆÄÀÌÇÁ ÆÄÀÌÇÁ´Â °£°áÇÏ°íµµ °­·ÂÇÑ ÇÁ·Î¼¼½º°£ Åë½Å¼ö´ÜÀÌ´Ù. ±×·¯³ª ÆÄÀÌÇÁ¿¡´Â ¿© ·¯°¡Áö Áß´ëÇÑ °áÁ¡ÀÌ ÀÖ´Ù. ù°·Î ÆÄÀÌÇÁ´Â ºÎ¸ð¿Í ÀÚ½ÄÇÁ·Î¼¼½º¿Í °°ÀÌ Á¶ »ó(ancestry)ÀÌ °°Àº ÇÁ·Î¼¼½ºµéÀ» ¿¬°áÇÏ´Â µ¥¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. µÑ°, ÆÄÀÌ ÇÁ´Â ¿µ±¸È÷ Á¸ÀçÇÒ ¼ö ¾ø´Ù. ÀÌ·± °áÁ¡À» º¸¿ÏÇϱâ À§ÇÏ¿© UNIX ½Ã½ºÅÛ III ¿¡¼­´Â ÆÄÀÌÇÁÀÇ ÇÑ º¯ÇüÀÌ µµÀԵǾú´Ù. ÀÌ »õ·Î¿î ÇÁ·Î¼¼½º°£ Åë½Å¹æ½ÄÀº FIFO ¶Ç´Â ¸í¸í µÈ ÆÄÀÌÇÁ(named pipe)¶ó ºÒ¸°´Ù. FIFO ´Â ¿µ±¸ÀûÀ̰í UNIX È­ ÀÏ À̸§À» ºÎ¿©¹Þ´Â´Ù. FIFO ´Â ¶ÇÇÑ ¼ÒÀ¯ÀÚ, Å©±â, Á¢±Ù Çã°¡µîÀÌ ÁöÁ¤µÈ´Ù. FIFO ´Â ´Ù¸¥ UNIX È­ÀÏó·³ °³¹æµÇ°í Æó¼âµÇ°í »èÁ¦µÉ ¼ö ÀÖÀ¸³ª, Àаųª ¾µ ¶§´Â ÆÄÀÌÇÁÀÇ ¼ºÁúÀ» ³ªÅ¸³½´Ù. FIFO °¡ ¸í·É¾î ¼öÁØ¿¡¼­´Â ¾î¶»°Ô »ç¿ëµÇ´Â Áö »ìÆìº¸ÀÚ. FIFO ¸¦ ¸¸µé±â À§ÇÏ¿© mknod ¸í·ÉÀÌ »ç¿ëµÈ´Ù. $/etc/mknod channel p ¿©±â¼­ channel Àº FIFO ÀÇ À͸§ÀÌ´Ù. Àμö p´Â mknod °¡ FIFO ¸¦ »ý¼ºÇϵµ·Ï ÇÑ´Ù. ÀÌ FIFO ¸¦ Ç¥ÁØ UNIX ¸í·ÉÀ» »ç¿ëÇÏ¿© Àаųª ¾µ¼ö ÀÖ´Ù. $cat < channel ÀÌ ¸í·É¾î channel ÀÌ ¸¸µé¾îÁø Á÷ÈÄ ¼öÇàµÈ´Ù¸é, ÀÌ ¸í·É¿¡ ´ëÇÑ Ã³¸®°¡ Áö ¿¬µÉ °ÍÀÌ´Ù. À̰ÍÀº ÀڷḦ Àбâ À§ÇØ FIFO ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î ¼¼½º°¡ ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÒ ¶§±îÁö ºí·°µÇ±â ¶§¹®ÀÌ´Ù. ¸¶Âù°¡Áö ·Î ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀڷḦ Àбâ À§ÇØ FIFO ¸¦ °³¹æÇÒ ¶§±îÁö ºí·°µÈ´Ù. 6.4.1. FIFO ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö FIFO ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹ÖÀº ÀϹÝÀûÀÎ ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö°ú °°´Ù. Â÷ÀÌÁ¡Àº ´ÜÁö óÀ½¿¡ ÆÄÀÌÇÁ¸¦ ¸¸µå´Â ¹æ¹ý»ÓÀÌ´Ù. FIFO ´Â pipe ½Ã½ºÅÛ È£Ãâ À» ÀÌ¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó mknod ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ¸¸µé¾îÁø´Ù. FIFO ´Â ÀÏ´Ü ¸¸µé¾îÁö¸é open À» ÀÌ¿ëÇÏ¿© °³¹æµÈ´Ù. #include . . fd = open("fifo", O_WRONLY); ÀڷḦ ¾²±âÀ§ÇØ FIFO ¸¦ °³¹æÇÑ´Ù. ¾Õ Àý¿¡¼­ º» ¹Ù¿Í °°ÀÌ ÀÌ È£ÃâÀº ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÒ ¶§±îÁö ºí·°µÈ´Ù(¹°·Ð FIFO °¡ ÀÌ¹Ì ÀڷḦ ¾²±â À§ÇØ °³¹æµÇ¾î ÀÖ´Ù¸é, open Àº Áï½Ã º¹±ÍÇÒ °ÍÀÌ´Ù.) FIFO ¿¡ ´ëÇÑ ºí·°µÇÁö ¾Ê´Â open µµ °¡´ÉÇÏ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­ open Àº O_RDONLY, O_WRONLY, O_ROWR ÁßÀÇ Çϳª¿Í ºñÆ® ´ÜÀ§ OR ¿¬»êµÈ O_NDELAY Ç÷¡ ±×¸¦ ÀÌ¿ëÇÏ¿© È£ÃâµÇ¾î¾ß ÇÑ´Ù. if((fd = open("fifo", O_RDONLY|O_NDELAY)) < 0) perror("open on fifo"); ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º°¡ ¾ø´Ù¸é ÀÌ open Àº ºí·°µÇ´Â ´ë ½Å -1 À» µ¹·Á ÁÖ°í errno ´Â ENXIO °ªÀ» °¡Áø´Ù. ¹Ý¸é¿¡ open ÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, ÀÌÈÄ¿¡ ¼öÇàµÇ´Â FIFO ¿¡ ´ëÇÑ read ¿ª½Ã ºí·°µÇÁö ¾Ê´Â´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 59¹ø Á¦ ¸ñ:[moohou] Unix System Programming 7 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:40 ÀÐÀ½:3487 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- _________________________________________________________________________ Unix System Programming 7 - ±è¼ºÈ£(moohou) _________________________________________________________________________ Á¦7Àå. ÇÁ·Î¼¼½º°£ Åë½Å : 2 7.1. ¼­·Ð Á¦ 6 Àå¿¡¼­ »ìÆìº» ÇÁ·Î¼¼½º°£ÀÇ Åë½Å¹æ¹ýÀº ´ëºÎºÐÀÌ ¿©·¯ ÇØ µ¿¾È UNIX »ó ¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëµÈ °ÍµéÀÌ´Ù. ½Ã½ºÅÛ V ¿¡¼­´Â ¸î°¡Áö »õ·Î¿î ±â´ÉÀÌ µµÀÔ µÇ¾î AT&T ÀÇ ½Ã½ºÅÛ V ÀÎÅÍÆäÀ̽º Á¤ÀÇ¿¡ ¼ö·ÏµÇ¾ú´Ù. ¿ì¼± °¡Àå °£´ÜÇÑ °ÍÀº ·¹ÄÚµå ·ÏÅ·(record locking)À¸·Î¼­ ÀÌ´Â Á÷Á¢ÀûÀÎ ÇÁ·Î¼¼½º Åë½ÅÇüŰ¡ ¾Æ´Ï ¶ó ÇÁ·Î¼¼½ºµéÀÇ Çù·Â¹æ¹ýÀÌ´Ù. À̰ÍÀº ÇÁ·Î¼¼½º°¡ ÀÚ½ÅÀÇ ¹èŸÀûÀÎ »ç¿ëÀ» À§ ÇØ È­ÀÏÀÇ ÀϺθ¦ ÀԽ÷Πº¸Á¸ÇÒ ¼ö ÀÖ°Ô ÇÏ¿©, µ¥ÀÌŸ º£À̽º°ü¸®ÀÇ ¸î°¡Áö ¾î·Á¿î ¹®Á¦ ¸¦ ÇØ°áÇÏ°Ô ÇÑ´Ù. ½Ã½ºÅÛ V ÀÇ »õ·Î¿î ÇÁ·Î¼¼½º°£ Åë½Å¹æ¹ý Áß ´Ù¸¥ °ÍµéÀº Á¶±ÝÀº ÀÌ»öÀûÀ̸ç, ½Ã½ºÅÛ V ÀÇ ±âº»¼³ºñ(facility)¸¦ È®ÀåÇÑ °Í À¸·Î »ý°¢ÇÒ¼ö ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌµé »õ±â´ÉµéÀº IPC(IPC ´Â ÇÁ¼Ò¼¼½º°£ Åë½Å À» ÀǹÌÇÑ´Ù)¶ó ÇÑ´Ù. 1. ¸Þ½ÃÁö Àü´Þ(Message Passing) ¸Þ½ÃÁö Àü´Þ ¼³ºñ´Â ÇÁ·Î¼¼½º°¡ ¸Þ½ÃÁö¸¦ ÁÖ°í ¹ÞÀ» ¼ö ÀÖ°Ô ÇÑ´Ù. À̶§ ¸Þ ½ÃÁö¶õ ÀÔÀÇÀÇ ¹®ÀÚ¿­À̳ª ¹ÙÀÌÆ®¿­ÀÌ´Ù. 2. ¼¼¸¶Æ÷¾î(Semaphore) ¸Þ½ÃÁö Àü´Þ°ú ºñ±³Çϸé, ¼¼¸¶Æ÷¾î´Â ÇÁ·Î¼¼½º µ¿±âÈ­¸¦ À§ÇÑ º¸´Ù ÇϺÎÀû ÀÎ ¼ö´ÜÀ» Á¦°øÇÏ´Â °ÍÀ̸ç, ¸¹Àº ¾çÀÇ Á¤º¸¸¦ Àü´ÞÇÏ´Â °Í¿¡´Â ÀûÇÕÇÏÁö ¾Ê´Ù. 3. °øÀ¯¸Þ¸ð¸®(Shared Memory) À̰ÍÀº µÎ °³ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ƯÁ¤ ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ÀÖ´Â ÀڷḦ °øÀ¯ ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¹°·Ð ÇÁ·Î¼¼½ºÀÇ ÀÚ·á ¿µ¿ªÀº º¸Åë ÀڽŸ¸ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ±â´ÉÀº IPC ¹æ¹ýÁß °¡Àå ºü¸£Áö¸¸ ¾à°£ÀÇ Çϵå¿þ¾î Áö¿øÀ» ÇÊ¿ä·Î ÇÑ´Ù. 7.2. ·¹ÄÚµå ·ÏÅ· 7.2.1. µ¿±â ·ÏÀº È­ÀÏ ³»¿ëÀ» °Çµå¸®Áö´Â ¾ÊÀ¸¸ç, ´Ù¸¥ ÇÁ·Î¼¼½ºµé¿¡°Ô ÇØ´ç µ¥ÀÌŸ°¡ »ç ¿ëÁßÀÓÀ» ³ªÅ¸³»´Â °ÍÀÌ´Ù. ÀÌ´Â ÇϳªÀÇ ³í¸®Àû ÀÛ¾÷ ¶Ç´Â Æ®·£Àè¼ÇÀ» ±¸¼ºÇÏ ´Â ÀÏ·ÃÀÇ Ã³¸® °úÁ¤ µµÁß¿¡ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ¶Ù¾îµå´Â °ÍÀ» ¸·´Â´Ù. ÀÌ·¯ÇÑ À¯ÇüÀÇ ¹æ¹ýÀ» ·¹ÄÚµå ·ÏÅ·À̶ó Çϸç, À̶§ÀÇ ·¹ÄÚµå´Â È­ÀÏÀÇ ÀÓÀÇÀûÀÇ ÀϺΠ¸¦ ÁöĪÇÑ´Ù. ¿Ïº®À» ±âÇϱâ À§Çؼ­´Â ·ÏÅ· ÀÛ¾÷ÀÌ ¿øÀÚÈ­ µÇ¾î¾ß ÇÑ´Ù. Áï, ÀÌ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇÑ ¸ð¼øµÇ´Â ·ÏÅ· ½Ãµµ¿Í´Â º´ÇàµÉ ¼ö ¾ø´Ù. 7.2.2. lockf È£Ãâ #include int filedes, purpose, status; long recsize; . . status = lockf(filedes, purpose, recsize); lockf ´Â SVID ¿¡ Á¤ÀÇµÈ ·¹ÄÚµå ·ÏÅ· ±â¹ý Áß °¡Àå ´Ü¼øÇÑ °ÍÀÌ´Ù. lockf(±× ¸®°í fcntl)¿¡ ÀÇÇÑ ·ÏÅ·Àº ´ÜÁö ±Ç°í¿ë(advisory)ÀÌ´Ù. ÀÌ´Â È­ÀÏ Çã°¡¸¸ ÀÖ À¸¸é ÇÁ·Î¼¼½º´Â È­ÀÏ¿¡¼­ ·ÏÀÌ µÈ °ÍÀ¸·Î ¾Ë·ÁÁø ºÎºÐÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °Í À» ÀǹÌÇÑ´Ù. lockf ÀÇ Ã¹¹øÂ° Àμö filedes ´Â °³¹æµÈ È­ÀÏ ±â¼ú¾î¶ó¾ß ÇÑ´Ù. ÀÌ´Â ·ÏÀÌ ¼öÇàµÉ È­ÀÏÀ» ÁöÁ¤Çϰí, O_WRONNLY ³ª O_RDWR ¸¦ »ç¿ëÇÏ¿© °³¹æµÈ °ÍÀ̶ó¾ß ÇÑ´Ù. purpose Àμö´Â lockf °¡ ½ÇÁ¦·Î ¹«¾ùÀ» ¼öÇàÇÒ °ÍÀΰ¡¸¦ °áÁ¤ ÇÑ´Ù. À̸¦ À§ÇØ Çã¿ëµÈ °ªµéÀº È­ÀÏ unistd.h ¿¡ ´Ù¸§°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù. #define F_ULOCK 0 /*Unlock a locked record */ #define F_LOCK 1 /*lock a record for excl usive use */ #define F_TLOCK 2 /*test for lock, lock if none */ #define F_TEST 3 /*test for existing lock only */ lockf ÀÇ ¸¶Áö¸· Àμö recsize ´Â ·Ï(lock), ÇØÁ¦(unlock), ¶Ç´Â ´Ü¼øÈ÷ °Ë»ç µÉ ¿µ¿ª(section)ÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ¿µ¿ªÀÇ ½ÃÀÛÀ§Ä¡´Â È­ÀÏÀÇ Àбâ-¾²±â Æ÷ÀÎÅÍÀÇ ÇöÀçÀ§Ä¡¿Í °°´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î, lockf ´Â lseek ´ÙÀ½¿¡ È£ÃâµÈ´Ù. F_LOCK purpose °ªÀ» F_LOCK À¸·ÎÇÏ¿© lockf ¸¦ È£ÃâÇϸé, ½Ã½ºÅÛÀº È­ÀÏÀÇ Àбâ-¾² ±â Æ÷ÀÎÅÍ¿Í recsize ·Î Á¤ÀǵǴ ¿µ¿ª¿¡ ·ÏÀ» ÇÏ·Á ½ÃµµÇÑ´Ù. lockf(fdes, F_LOCK, 512L); ´Â ÇöÀçÀÇ Àбâ-¾²±â Æ÷ÀÎÅÍÀÇ À§Ä¡¿¡¼­ ½ÃÀÛÇÏ¿© 512 ¹ÙÀÌÆ®¿¡ ·ÏÀ» °Ç´Ù. F_ULOCK F_ULOCK Àº È£ÃâÇÁ·Î¼¼½º¿¡ ÀÇÇØ Àü¿¡ ·ÏµÈ ¿µ¿ªÀ» ÇØÁ¦(unlock)ÇÑ´Ù. ÀÌ´Â º¸Åë F_LOCK À̳ª F_TLOCK ÀÌ ¿äûµÈ ÈÄ¿¡ »ç¿ëµÈ´Ù. ¸¸¾à ¹æ±Ý ÇØÁ¦µÈ ¿µ¿ªÀ» ·ÏÇÏ·Á°í ±â´Ù¸®´ø ÇÁ·Î¼¼½º°¡ ÀÖ´Ù¸é, ±× Áß Çϳª°¡ ´Ù½Ã ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. F_TEST F_TEST ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÇØ´ç ¿µ¿ªÀÌ ·Ï µÇ¾ú´Â Áö¸¦ °Ë»çÇÏ´Â °ÍÀÌ ´Ù. ÀÌ¿µ¿ªµµ ¿ª½Ã È­ÀÏÀÇ ÇöÀç À§Ä¡¿Í Àμö recsize ¿¡ ÀÇÇØ ÁöÁ¤µÈ´Ù. ·Ï µÇ ¾î ÀÖÁö ¾Ê´Ù¸é lockf´Â 0 À» µ¹·ÁÁØ´Ù. F_TLOCK ÀÌ ¿äûÀº F_TEST ¿Í F_LOCK À» °áÇÕÇÑ °ÍÀ¸·Î, È­ÀÏ¿¡¼­ ±âÁ¸¿¡ ·ÏµÈ ¿µ¿ª À» ´Ù½Ã ·ÏÇÏ·Á ÇÒ¶§, ÇÁ·Î±×·¥ÀÌ ¼öÇàÀ» ÁßÁöÇÏÁö ¾Ê°í ´Ù¸¥ ÇൿÀ» °è¼ÓÇÏ·Á ´Â °æ¿ì¿¡ À¯¿ëÇÏ´Ù. ·Ï µÇÁö ¾ÊÀº ¿µ¿ª¿¡ ´ëÇØ F_TLOCK ÀÌ »ç¿ëµÇ¸é, F_LOCK °ú °°ÀÌ ·ÏÀÌ Àû¿ëµÈ´Ù. ·ÏµÈ ¿µ¿ª¿¡ ´ëÇØ¼­´Â, lockf ´Â -1 À» µ¹·ÁÁÖ°í error ¸¦ EACCES (UNIX ÀÇ ¹Ì·¡ ¹öÀü¿¡´Â EAGAIN)·Î ÇÑ´Ù. recsize Àμö°¡ 0 °ªÀ» °®´Â °æ¿ì ¸¸¾à lockf ÀÇ Àμö recsize ÀÇ °ªÀÌ 0 À̶ó¸é, ·ÏµÇ´Â È­ÀÏÀÇ ¿µ¿ªÀº È­ÀÏ ÀÇ ÇöÀç À§Ä¡ºÎÅÍ È­ÀÏ Å©±âÀÇ ÃÖ´ë ÇѰè(ÀÌ´Â °¢ ±¸Çö¸¶´Ù ´Ù¸£´Ù)±îÁö·Î Á¤ ÇØÁø´Ù. lseek(fd, 0L, 0); lockf(fd, F_LOCK, 0L); À̰ÍÀº °£´ÜÈ÷ È­ÀÏ Àüü¸¦ ·ÏÇÑ´Ù. ±³ÇлóÅ µÎ ÇÁ·Î¼¼½º PA ¿Í PB °¡ °°Àº È­ÀÏ¿¡¼­ ÀÛ¾÷ÁßÀ̶ó ÇÏÀÚ. ¶Ç PA °¡ F_LOCK ¿äûÀÌ ÀÌ·¯ÇÑ ±³Âø»óŸ¦ À¯¹ßÇÏ·Á ÇÑ´Ù¸é, È£ÃâÀº ½ÇÆÐÇÏ¿© -1 À» µ¹·ÁÁÖ°í errno °ªÀ» EDEADLK À¸·Î ÇÑ´Ù.(EDEADLK Àº ½Ã½ºÅÛ ·Ï Å×À̺íÀÌ °¡µæÂù °æ¿ì µµ ÀǹÌÇÒ ¼ö ÀÖ´Ù.) 7.2.3. fcntl À» »ç¿ëÇÑ ·¹ÄÚµå ·ÏÅ· ¿ì¸®´Â ÀÌ¹Ì È­ÀÏÁ¦¾îÈ£Ãâ fcntl À» ¼Ò°³Çß´Ù. º¸ÅëÀÇ ±â´É°ú´Â º°µµ·Î fcntl Àº lockf º¸´Ù ÀϹÝÀûÀÎ ÇüÅÂÀÇ ·¹ÄÚµå ·ÏÅ·À» ¼öÇàÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ ´Â µÎ°¡Áö ÇüÅÂÀÇ ·ÏÀ» Á¦°øÇÑ´Ù. 1. ÀÐ±â ·Ï Àб⠷ÏÀº ´Ü¼øÇÏ°Ô ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ¾²±â ·ÏÀ̶ó´Â µÎ¹øÂ° ÇüÅÂÀÇ ·ÏÀ» ¸øÇϵµ·Ï ÇÑ´Ù. 2. ¾²±â ·Ï ¾²±â ·ÏÀº ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ÇØ´ç±¸¿ª¿¡ Àб⳪ ¾²±â ·ÏÀ» ÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù. ·¹ÄÚµå ·ÏÅ·À» À§ÇØ fcntl À» ´ÙÀ½°ú °°ÀÌ »ç¿ëµÈ´Ù. #include struct lock ldata; int filedes, cmd, status; . . status = fcntl(filedes, cmd, &ldata); filedes Àμö´Â ¿ª½Ã À¯È¿ÇÑ °³¹æµÈ È­ÀÏ ±â¼ú¾î¶ó¾ß ÇÑ´Ù. Àб⠷ÏÀ» À§Çؼ­ ´Â filedes ´Â O_RDONLY ³ª O_RDWR À» ÀÌ¿ëÇØ¼­ °³¹æµÇ¾î¾ß ÇÑ´Ù. µû¶ó¼­ creat ¿¡ ÀÇÇÑ È­ÀÏ ±â¼ú¾î´Â »ç¿ëµÉ ¼ö ¾ø´Ù. ¾²±â ·ÏÀ» À§Çؼ­´Â filedes ´Â O_WRONLY ³ª O_RDWR À» »ç¿ëÇØ °³¹æµÇ¾î¾ß ÇÑ´Ù. ·¹ÄÚµå ·ÏÅ·¿¡´ëÇÑ Àμö cmd ÀÇ °ªÀº ´ÙÀ½ÀÇ 3 °³ÀÌ´Ù. F_GETLK ldata Àμö¸¦ ÅëÇØ Àü´ÞµÈ µ¥ÀÌŸ¿¡ ±âÃÊÇØ¼­ ·Ï Á¤º¸¸¦ ¾ò´Â´Ù.(µÇµ¹¾Æ¿À´Â Á¤º¸´Â ldata ¿¡ ±â¼úµÈ ·ÏÀ» 'ºí·°(block)'Çϴ ù¹øÂ° ·ÏÀ» °¡¸®Å²´Ù. F_SETLK È­ÀÏ¿¡ ·ÏÀ» ½ÃµµÇϰí, ºÒ°¡´ÉÇϸé Áï½Ã µÇµ¹¾Æ¿Â´Ù. Ȱµ¿ÁßÀÎ ·ÏÀ» Á¦°ÅÇÏ ´Â µ¥µµ »ç¿ëµÈ´Ù. F_SETLKW È­ÀÏ¿¡ ·ÏÀ» ½ÃµµÇϰí, À̰ÍÀÌ ¸¸¾à ´Ù¸¥ ÇÁ·Î¼¼½º ¼ÒÀ¯ÀÇ ·Ï¿¡ ÀÇÇØ ºí·°µÇ ¸é ¼öÇàÀ» ÁßÁöÇÑ´Ù. lockf ¿¡ F_LOCK ¸¦ »ç¿ëÇÑ °æ¿ì¿Í °°ÀÌ fcntl ·Ï¿¡ ÀÇ ÇØ¼­ ¼öÇàÀÌ Áß´ÜµÈ ÇÁ·Î¼¼½º´Â ½Ã±×³Î¿¡ ÀÇÇØ ÀÎÅÍ·´Æ® µÉ ¼ö ÀÖ´Ù. ±¸Á¶(structure) ldata ´Â ·Ï ±â¼ú¾îÀÌ´Ù. ÀÌÀÇ ÀÚ·áÇü flock Àº fcntl.h ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù. short l_type; /* descrives type of lock */ short l_whence; /*offset type, like lseek */ long l_start; /* offset in bytes */ long l_len; /* segment size in bytes */ short l_pid; /* set by F_GETLK command */ l_whence, l_start ±×¸®°í l_len Àº ·Ï, °Ë»ç, ¶Ç´Â ÇØÁ¦µÇ¾îÀý È­ÀÏÀÇ ±¸¿ª À» ÁöÁ¤ÇÑ´Ù. l_whence ´Â lseek ÀÇ ¼¼¹øÂ° Àμö¿Í ¸Å¿ì À¯»çÇÏ´Ù. Áï °ªÀ¸·Î ¼­ 0,1,2 ¸¦ °®´Â °æ¿ì¿¡ °¢°¢ È­ÀÏÀÇ Ã³À½, Àбâ-¾²±â Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â Çö ÀçÀÇ À§Ä¡, ±×¸®°í È­ÀÏÀÇ ³¡À» º¯À§(offset)ÀÇ ±âÁØÁ¡À¸·Î¼­ ³ªÅ¸³½´Ù. l_start ´Â ±¸¿ªÀÇ ½ÃÀÛ À§Ä¡¸¦ l_whence ¿¡ ´ëÇÑ »ó´ëÀ§Ä¡·Î¼­ ³ªÅ¸³½´Ù. l_len Àº ¹ÙÀÌÆ® ´ÜÀ§·Î¼­ÀÇ ±¸¿ªÀÇ ±æÀÌÀÌ´Ù. lockf ÀÇ °æ¿ì¿Í °°ÀÌ ÀÌ °ªÀÌ 0 À̸é, ¼¼±×¸ÕÆ®ÀÇ ±æÀÌ´Â °¡´ÉÇÑ ÃÖ´ëÀÇ º¯À§°¡ µÈ´Ù. l_type Àº Àû¿ëµÇ´Â ·ÏÀÇ ÇüŸ¦ Áö½ÃÇÑ´Ù. ÀÌ¿¡ ´ëÇÑ °ªµéÀº fcntl.h ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ ´Ù. F_RDLCK Àû¿ëµÇ´Â ·ÏÀÌ Àб⠷ÏÀÌ´Ù. F_WRLCK Àû¿ëµÇ´Â ·ÏÀÌ ¾²±â ·ÏÀÌ´Ù. F_UNLCK ƯÁ¤ ±¸¿ª¿¡ ´ëÇÑ ·ÏÀ» ÇØÁ¦ÇÑ´Ù. l_pid ´Â fcntl ÀÇ ¸í·ÉÀ¸·Î F_GETLK ÀÌ ¼±ÅÃµÈ °æ¿ì¿¡¸¸ À¯È¿ÇÏ´Ù. ÇöÀç ½Ã µµÇÏ´Â ·ÏÀÌ ±âÁ¸ÀÇ ·Ï¿¡ ÀÇÇØ ºí·°µÇ´Â °æ¿ì, l_pid ´Â ±âÁ¸ÀÇ ·Ï À» ÁöÁ¤ÇÑ ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ½Äº°¹øÈ£°ªÀ» °®´Â´Ù. 7.3. IPC ¼³ºñ 7.3.1. ¼Ò°³¿Í ±âº»°³³ä UNIX ½Ã½ºÅÛ V ´Â IPC ¼³ºñ¶ó´Â »õ·Ó°í ´Ù¾çÇÑ ÇÁ·Î¼¼½º°£ Åë½Å ¹æ¹ýÀ» Á¦°ø ÇÑ´Ù. ´ÜÀ§ ÀÛ¾÷µéÀÌ ¼­·Î Çù·ÂÇÏ´Â ½Ã½ºÅÛÀ» ÇÁ·Î±×·¥ÇÒ ¶§ ´Ù¾çÇÑ Á¾·ùÀÇ ¹æ ¹ý·ÐÀûÀÎ Á¢±ÙÀÌ °¡´É ÇÏ°Ô µÇ¾ú´Ù. ¹Ý¸é¿¡ IPC ¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º´Â º¸ÅëÀÇ UNIX °³³ä°ú´Â ¸ÂÁö ¾Ê¾Æ¼­, ÇØ´ç ºÎºÐÀº ½Ã½ºÅÛÀÇ ´Ù¸¥ ºÎºÐ°ú ºÎÁ¶È­¸¦ ÀÌ·é ´Ù. IPC ¼³ºñ´Â ´ÙÀ½ÀÇ ¼¼ ºÎ·ù·Î ³ª´¶´Ù. 1. ¸Þ½ÃÁö Àü´Þ 2. ¼¼¸¶Æ÷¾î 3. °øÀ¯¸Þ¸ð¸® IPC ¼³ºñ Ű °¡Àå Áß¿äÇÑ °øÅë ±â´ÉÀº IPC ¼³ºñ ŰÀÌ´Ù. ۶õ È­ÀÏ À̸§ÀÌ È­ÀÏÀ» ÁöÁ¤ÇÏ ´Â °Í°ú ¸¶Âù°¡Áö·Î UNIX ½Ã½ºÅÛÀÇ IPC °´Ã¼¸¦ ÁöÁ¤ÇÏ´Â µ¥ »ç¿ëÇÏ´Â ¼ýÀÚÀÌ ´Ù. Áï Ű´Â ¿©·¯ ÇÁ·Î¼¼½º»çÀÌ¿¡ IPC ÀÚ¿øÀÌ ½±°Ô °øÀ¯µÇµµ·Ï ÇØÁØ´Ù. ÁöÁ¤µÉ ¼ö ÀÖ´Â °´Ã¼·Î´Â ¸Þ½ÃÁö Å¥, ¼¼¸¶Æ÷¾îÀÇ Á¢ÇÕ, ¶Ç´Â °øÀ¯ ¸Þ¸ð¸® ¼¼±×¸ÕÆ® µî À» µé ¼ö ÀÖ´Ù. ŰÀÇ ½ÇÁ¦ ÀÚ·áÇüÀº ±¸Çö¿¡ Á¿ìµÇ´Â ÀÚ·áÇü key_t ¿¡ ÀÇÇØ °á Á¤µÈ´Ù. key_t ´Â ½Ã½ºÅÛ Çì´õÈ­ÀÏ types.h ¿¡¼­ Á¤ÀǵȴÙ. UNIX ÀÇ ¾î¶² ¹öÁ¯ Àº È­ÀÏÀÇ °æ·ÎÀ̸§À» Ű·Î º¯È¯ÇØÁÖ´Â ´Ü¼øÇÑ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ·çƾÀÇ À̸§Àº ftok ÀÌ´Ù. #include #include key_t keyval, ftok(); char *path, id; . . keyval = ftok(path, id); ÀÌ·çÆ¾Àº È­ÀÏ path ¿¡ °ü·ÃµÈ Á¤º¸¿¡ ±âÃÊÇØ¼­ Ű °ªÀ» µ¹·ÁÁØ´Ù. °°Àº path °ª¿¡ ´ëÇØ¼­¶óµµ id °ªÀÌ ´Ù¸£¸é ´Ù¸¥ Ű °ªÀÌ »êÃâµÈ´Ù. ftok °¡ °¡Àå À¯¿ëÇÑ ÀÀ¿ëºÐ¾ß´Â, ¸í¸íµÈ È­ÀÏ µéÀ» Á¶ÀÛÇϴµ¥ IPC ±â´ÉµéÀÌ »ç¿ëµÉ °æ¿ì, ¶Ç´Â ÇÊ ¼ö ºÒ°¡°áÇÏ°í ¿µ±¸ÀûÀ̸鼭 ºÒº¯ÇÏ´Â È­ÀÏ¿¡ ´ëÇÑ À̸§ÀÌ ÁÖ¾îÁø °æ¿ìÀÌ´Ù. IPC get ¿¬»ê ÇÁ·Î±×·¥Àº IPC °´Ã¼¸¦ »ý¼ºÇϰųª ±âÁ¸ÀÇ °Í¿¡ Á¢±ÙÇÏ·Á ÇÒ ¶§ key ¸¦ »ç¿ë ÇÑ´Ù. µÎ°¡Áö ¸ðµÎ IPC get ¿¬»êÀ¸·Î È£ÃâµÈ´Ù. Çѹø »ý¼ºµÈ IPC ¼³ºñ ½Äº°ÀÚ ´Â À¯ÀÏÇÏ´Ù. Áï, ¼­·Î ´Ù¸¥ ÇÁ·Î¼¼½º¶óµµ µ¿ÀÏÇÑ IPC °´Ã¼¸¦ À§Çؼ­´Â °°Àº °ªÀ» »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½ÀÇ ¹®ÀåÀº IPC È£Ãâ msggetÀ» »ç¿ëÇÏ¿© »õ·Î ¿î ¸Þ½ÃÁö Å¥¸¦ »ý¼ºÇÑ´Ù. msg_qid = msgget((key_t)0100, 0644|IPC_ CREAT|IPC_EXCL); msgget ÀÇ Ã¹ Àμö´Â ¸Þ½ÃÁö Å¥ÀÇ Å°ÀÌ´Ù. ±×¹ÛÀÇ IPC ¿¬»ê IPC ¼³ºñ¿Í °°ÀÌ »ç¿ëµÇ´Â ¿¬»ê¿¡´Â ´ÙÀ½ÀÇ µÎ°¡Áö À¯ÇüÀÌ ÀÖ´Ù. Çϳª´Â »ó ÅÂÁ¤º¸¸¦ ¾ò°Å³ª Á¦¾î °ªÀ» ÁöÁ¤ÇÏ´Â Á¦¾î ¿¬»êÀÌ´Ù. ÀÌ¿¡ ¼ÓÇϴ ȣÃâ·Î´Â msgctl, semctl, shmctl µîÀÌ ÀÖ´Ù. ´Ù¸¥ Çϳª´Â Á» ´õ Ư¼öÇÑ ¿¬»êÀ¸·Î¼­, ºñ·Ï °¢°¢ÀÇ È£ÃâÀº ¼­·Î ´Ù¸¥ À̸§À» °®°í ÀÖÁö¸¸, Ç¥ÁØÇü ¸Å´º¾ó¿¡¼­´Â À̵é À» msgop, oemop, shmop À̶ó´Â Ç¥Á¦ÇÏ¿¡ ¸ð¾Æ³õ°í ÀÖ´Ù. ¿¹¸¦ µé¸é, msgop ¿¡ ´Â ´ÙÀ½ÀÇ µÎ ÇÔ¼ö°¡ ÀÖ´Ù. msgsnd ´Â ¸Þ½ÃÁö Å¥¿¡ ¸Þ½ÃÁö¸¦ Àü´ÞÇϰí, msgrcv ´Â ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. »óÅÂÀڷᱸÁ¶ IPC °´Ã¼°¡ »ý¼ºµÇ¸é ½Ã½ºÅÛÀº IPC ¼³ºñ »óÅ ±¸Á¶¸¦ ¸¸µé¾î¼­ ÇØ´ç °´Ã¼¿Í °ü·ÃµÈ °¢Á¾ °ü¸® Á¤º¸¸¦ ¼ö·ÏÇÑ´Ù. »óÅ ÀÚ·á ±¸Á¶ÀÇ ÀÚ·á ÇüÀº ¸Þ½ÃÁö, ¼¼¸¶ Æ÷¾î, °øÀ¯ ¸Þ¸ð¸®¸¶´Ù Çϳª¾¿ Á¸ÀçÇÑ´Ù. ¼¼°¡ÁöÀÇ »óÅ ±¸Á¶ ÀÚ·áÇüÀº ¸ðµÎ °øÅëÀûÀ¸·Î Çã°¡ ±¸Á¶¸¦ Æ÷ÇÔÇÑ´Ù. ÀÌ Çã°¡±¸Á¶´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÇ¸ç ÅÂ±× (tag) ipc_perm À¸·Î ½Äº°µÈ´Ù. ushort cuid; /*user-id of creator of IPC object*/ ushort cgid; /* group-id of creator */ ushort uid; /* effective user-id */ ushort gid; /* effective group-id */ ushort umode; /* permissions */ ÀÌ »óÅ ÀÚ·á ±¸Á¶´Â »ç¿ëÀÚ°¡ IPC °´Ã¼¸¦ Àо ÇØ´ç Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â Áö, ¶Ç´Â ±× °´Ã¼¿¡ Á¤º¸¸¦ ¾µ ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù. 7.3.2. ¸Þ½ÃÁö Àü´Þ ¸Þ½ÃÁö¶õ º»ÁúÀûÀ¸·Î ¹®ÀÚ³ª ¹ÙÀÌÆ®ÀÇ ¿­ÀÌ´Ù.(¹Ýµå½Ã ³Î ¹®ÀÚ·Î ³¡³¯ ÇÊ¿ä´Â ¾ø´Ù.) ¸Þ½ÃÁö´Â ÇÁ·Î¼¼½º °£¿¡ ¸Þ½ÃÁö Å¥¸¦ ÅëÇØ Àü´ÞµÇ¸ç,¸Þ½ÃÁöÅ¥´Â msgget ÇÁ¸®¹ÌƼºê¿¡ ÀÇÇØ »ý¼ºµÇ°í Á¢±ÙµÈ´Ù. ÀÏ´Ü Å¥°¡ ¸¸µé¾îÁö¸é, Àû´çÇÑ ±Ç¸®¸¦ °¡Áø ÇÁ·Î¼¼½º°¡ msgrcv ¿¡ ÀÇÇØ ÀÌ ¸Þ½ÃÁö¸¦ Å¥¿¡ ³²±æ ¼ö ÀÖ´Ù. ´Ù¸¥ ÇÁ·Î¼¼ ½º´Â msgrcv ¿¡ ÀÇÇØ ÀÌ ¸Þ½ÃÁö¸¦ Å¥·ÎºÎÅÍ Á¦°ÅÇÑµÚ ÀоîµéÀÏ ¼ö ÀÖ´Ù. #include #include #include int msg_qid, permflags; key_t key; . . msg_qid = magget(key, permflags); ÀÇ È£ÃâÀº µÎ ±â´É open °ú creat ¸¦ µ¿½Ã¿¡ ¼öÇàÇÏ´Â °Í°ú °°ÀÌ »ý°¢µÇ¾îÁú ¼ö ÀÖ´Ù. permflags Àμö´Â msgget ÀÌ ¼öÇàÇØ¾ß ÇÒ ÀÛ¾÷À» Á¤È®È÷ °áÁ¤ÇÑ´Ù. À̵ °ü·ÃÀÌ ÀÖ´Â µÎ°³ÀÇ »ó¼ö°¡ ipc.h È­ÀÏ¿¡ Á¤ÀǵǾî Àִµ¥, À̵éÀº µ¶¸³ ÀûÀ¸·Î »ç¿ëµÉ ¼öµµ ÀÖ°í, ºñÆ®³¢¸® OR µÉ ¼öµµ ÀÖ´Ù. IPC_CREAT À̰ÍÀº key ¿¡ ÇØ´çÇÏ´Â ¸Þ½ÃÁö Å¥°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡ msgget °¡ À̸¦ »ý¼ºÇϵµ·Ï Áö½ÃÇÑ´Ù. IPC_EXCL IPC_CREAT ¿Í À̰ÍÀÌ µ¿½Ã¿¡ ÁöÁ¤µÈ °æ¿ìÀÇ È£ÃâÀº ´ÜÁö ÇϳªÀÇ ¸Þ½ÃÁö Å¥ ¸¦ »ý¼ºÇÑ´Ù. msgop ·çƾµé : msgsnd ¿Í msgrcv ÀÏ´Ü Å¥°¡ »ý¼ºµÇ¸é, µÎ °³ÀÇ msgop ÇÁ¸®¹ÌƼºê¸¦ »ç¿ëÇÏ¿© À̸¦ ´Ù·ê¼ö ÀÖ ´Ù. ù¹ø °ÍÀº msgsnd ÀÌ´Ù. #include #include #include int msg_qid, size, flags, retval; struct my_msg{ long mtype; char mtext[SOMEVALUE]; }message; . . retval = msgsnd(msg_qid, &message, size, flags); msgsnd ´Â msgget À¸·ÎºÎÅÍ ¾òÀº msg_qid °¡ °¡¸®Å°´Â Å¥¿¡ ¸Þ½ÃÁö¸¦ º¸³½´Ù. ¸Þ½ÃÁö ÀÚü´Â ³î¶ó¿ó°Ôµµ »ç¿ëÀÚ°¡ Á¦°øÇÏ´Â ±¸Á¶·Î ¼±¾ðµÈ º¯¼ö message ¿¡ ´ã°ÜÁ® ÀÖ´Ù. struct my_msg{ long mtype; char mtext[SOMEVALUE]; }; msgsnd ÀÇ Àμö flags ´Â ´Ü ÇϳªÀÇ ÀǹÌÀÖ´Â °ªÀ» °®´Âµ¥ ÀÌ´Â IPC_NOWAIT ÀÌ´Ù. IPC_NOWAIT °¡ 0 ÀÎ °æ¿ì¿¡´Â ¸Þ½ÃÁö Àü´Þ¿¡ ÇÊ¿äÇÑ ½Ã½ºÅÛ ÀÚ¿øÀÌ ¾øÀ» ¶§ È£Ãâ ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀÌ ÁߴܵȴÙ. msgop À¯Çü¿¡ ¼ÓÇÏ´Â ¶Ç ÇϳªÀÇ ÇÔ¼ö´Â msgrcv ÀÌ´Ù. #include #include #include int msg_qid, size, flags, retval; struct my_msg{ long mtype; char mtext[SOMEVALUE]; }message; long msg_type; . . retval = msgrcv(msg_qid, &message, size, msg_type, flags); msgrcv °¡ »ç¿ëµÇ¸é, Å¥ÀÇ »ç¿ë Çã°¡¿¡ ÀúÃ˵ÇÁö ¾Ê´Â ÇÑ, msg_id °¡ °¡¸®Å° ´Â Å¥·Î ºÎÅÍ ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. ¸Þ½ÃÁö¸¦ Å¥¿¡¼­ ÀÐ°Ô µÇ¸é À̴ ť¿¡¼­ ÀÚµ¿ÀûÀ¸·Î Á¦°ÅµÈ´Ù. À̶§ message º¯¼ö´Â ¹Þ¾ÆµéÀÎ ¸Þ½ÃÁö¸¦ ÀúÀåÇϰí, size º¯¼ö´Â ÀÌ ±¸Á¶¿¡ ´ã¾ÆµÑ ¼ö ÀÖ´Â Á¤º¸ÀÇ ÃÖ´ë±æÀ̸¦ ÁöÁ¤ÇÑ´Ù. È£ÃâÀÌ ¼º°øÇÏ ¸é ¹Þ¾ÆµéÀÎ ¸Þ½ÃÁöÀÇ ±æÀ̰¡ retval ¿¡ ÁöÁ¤µÈ´Ù. msg_type Àμö´Â ½ÇÁ¦·Î ¾î ¶² ¸Þ½ÃÁö¸¦ ¹Þ¾Æµé ÀÏÁö¸¦ °áÁ¤ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ±âÁØÀº ¸Þ½ÃÁöÀÇ mtype ÇÊ µåÀÌ´Ù. msg_type ÀÇ °ªÀÌ 0 ÀÎ °æ¿ì´Â Å¥ÀÇ Á¦ÀÏ Ã¹¹øÂ° ¸Þ½ÃÁö, Áï °¡Àå ÀÏ Âïµé¾î¿Â ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. msg_type ÀÇ °ªÀÌ 0 º¸´Ù Å« °æ¿ì´Â ÇØ´ç °ªÀ» °¡Áø ¸Þ½ÃÁöÀÇ Ã¹¹øÂ° °ÍÀ» Àд´Ù. ¸¶Áö¸·À¸·Î msg_type ÀÌ 0 º¸´Ù ÀÛÀº °æ¿ì °¡ ÀÖ´Ù. À̶§´Â ¸Þ½ÃÁöÀÇ mtype °ªÀÌ msg_type ÀÇ Àý´ë°ªº¸´Ù À۰ųª °°Àº °Í Áß¿¡¼­ ÃÖ¼Ò°ªÀ» °®´Â ù¹øÂ° ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. ¸¶Áö¸· Àμö flags ´Â Á¦ ¾îÁ¤º¸¸¦ °®°ÔµÈ´Ù. À¯È¿ÇÑ °ªÀ¸·Î´Â IPC_NOWAIT ¿Í MSG_NOERROR °ªÀ» ´Üµ¶À¸ ·Î ȤÀº OR ÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. MSG_NOERROR °¡ ÁöÁ¤µÈ °æ¿ì, ¸Þ½ÃÁöÀÇ ³»¿ë ÀÌ size º¸´Ù ±æ¸é ÃʰúºÐÀ» Á¦°ÅÇÑ´Ù. ÁöÁ¤µÇÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â msgrcv °¡ ½ÇÆÐÇÏ°Ô µÈ´Ù. msgctl ½Ã½ºÅÛ È£Ãâ msgctl ¿¡´Â ¼¼°¡Áö ¸ñÀûÀÌ ÀÖ´Ù. À̵éÀº °¢°¢ ÇÁ·Î¼¼½º¿¡°Ô ¸Þ½ÃÁö Å¥ÀÇ »ó ÅÂÁ¤º¸¸¦ ÁÖ°í, ¸Þ½ÃÁö Å¥¿¡ °ü·ÃµÈ Á¦ÇÑ»çÇ×À» º¯°æÇÒ ¼ö ÀÖ°Ô Çϰí, ½Ã½ºÅÛ »ó¿¡¼­ Å¥¸¦ Á¦°ÅÇÒ ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ´Ù. #include #include #include int msg_qid, command, retval; struct msqid_ds msq_stat; . . retval = msgctl(msg_qid, command, &msq_stat ); ¹°·Ð msg_qid ´Â À¯È¿ÇÑ ¸Þ½ÃÁö Å¥ ½Äº°ÀÚÀÌ´Ù. &msq_stat ´Â msgid_ds ±¸Á¶ ¸¦ °®´Â º¯¼öÀÇ ÁÖ¼ÒÀÌ´Ù. ÀÌ ±¸Á¶´Â msg.h ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇ µÇ¾î ÀÖ´Ù. struct ipc_perm msg_perm; /*ownership/perms*/ ushort msg_qnum; /*no. messages on queue*/ ushort msg_qbytes; /*max. no. bytes for queue*/ ushort msg_lspid; /*pid of last msgsnd*/ ushort msg_lrpid; /*pid of last msgrcv*/ time_t msg_stime; /*last msgsnd time*/ time_t msg_rtime; /*last msgrcv time*/ time_t msg_ctime; /*last change time*/ ipc_perm ±¸Á¶´Â ¾Õ¿¡¼­ ¼³¸íÇßµíÀÌ ¸Þ½ÃÁö Å¥¿Í °ü·ÃµÈ ¼ÒÀ¯±Ç°ú »ç¿ëÇã°¡¸¦ ÀúÀåÇÑ´Ù. msg_ctl ÀÇ command Àμö´Â ¼öÇàµÉ ÀÛ¾÷À» Ç¥½ÃÇÑ´Ù. »ç¿ë °¡´ÉÇÑ °ªÀº 3 °³°¡ Àִµ¥ À̵éÀº IPC ±â´É 3 °³¿¡ ¸ðµÎ Àû¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ °ªµéÀº ipc.h ¿¡ »ó¼ö·Î Á¤ÀǵǾî ÀÖ´Ù. IPC_STAT ¸Þ½ÃÁö Å¥ÀÇ »óÅÂÁ¤º¸¸¦ msg_stat ¿¡ ´ã´Â´Ù. IPC_SET msg_stat ¿¡ ÀÖ´Â Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î ¸Þ½ÃÁö Å¥¿¡ ´ëÇÑ Á¦¾î º¯¼öµéÀÇ °ªÀ» ÁöÁ¤ÇÑ´Ù. IPC_RMID ÀÌ´Â ¸Þ½ÃÁö Å¥¸¦ ½Ã½ºÅÛ¿¡¼­ »èÁ¦ÇÏ°Ô ÇÑ´Ù. 7.3.3. ¼¼¸¶Æ÷¾î ÀÌ·ÐÀû ÇüÅÂÀÇ ¼¼¸¶Æ÷¾î ¼¼¸¶Æ÷¾î sem À̶õ ´ÙÀ½°ú °°Àº ¿¬»êÀÌ Çã¿ëµÈ Á¤¼öÇü º¯¼ö¸¦ ¸»ÇÑ´Ù(p ¿Í v ¶õ À̸§Àº wait ¿Í signal À̶õ ¸»ÀÇ ³×´ú¶õµå¾î¿¡¼­ ³ª¿Â °ÍÀ¸·Î À̶§ signal À̶õ ¹°·Ð UNIX ÀÇ signalÈ£Ãâ°ú´Â ´Ù¸¥ °ÍÀÌ´Ù). p(sem) or wait(sem) if(sem != 0) decrement sem by one else wait until ssem becomes no-zero v(sem) or signal(sem) if( queue of waiting processes not empty) restart first process in wait queue else increment sem by one µÎ ¿¬»êÀº ¸ðµÎ ¿øÀÚÈ­µÇ¾î¾ß ÇÑ´Ù. Áï sem À» º¯°æÇÒ ¼ö ÀÖ´Â ÇÁ·Î¼¼½º´Â ÇÑ ¼ø°£¿¡ ¿ÀÁ÷ Çϳª »ÓÀÌ´Ù. ¼¼¸¶Æ÷¾îÀÇ ÁÁÀº Á¡Àº ´ÙÀ½ÀÇ »ç½ÇÀÌ Ç×»ó ¸¸Á·µÈ´Ù ´Â °ÍÀÌ´Ù. (semaphore's initial value + number of v operations - number of completed p operations) >= 0 À̸¦ ¼¼¸¶Æ÷¾îÀÇ ºÒº¯Æ¯¼º(unvatiant)À̶ó ÇÑ´Ù. Àü»ê °úÇÐÀÚµéÀº ÀÌ·¯ÇÑ ºÒ º¯ Ư¼ºÀ» ¼±È£Çϴµ¥ ÀÌ´Â ÇÁ·Î±×·¥À» ü°èÀûÀÌ°í ¾ö°ÝÇÏ°Ô °ËÁ¤ÇÒ ¼ö ÀÖµµ·Ï Çϱ⠶§¹®ÀÌ´Ù. UNIX ½Ã½ºÅÛ V ¿¡¼­ ±¸ÇöµÈ ¼¼¸¶Æ÷¾î´Â ÀÌ·¯ÇÑ °³³ä¿¡ ±âÃÊÇßÁö¸¸ º¸´Ù ÀÏ¹Ý ÀûÀÎ(±×¸®°í ¾Æ¸¶µµ º¹ÀâÇÑ) ±â´ÉÀ» Á¦°øÇÑ´Ù. ¿ì¼± semget °ú semctl À» »ìÆì º¸ÀÚ. #include #include #include key_t key; int sem_id, nsems, permflags, command; int retval, sem_num; union semun{ int val; struct semid_ds *stat; ushort *array; } ctl_arg; . . sem_id = semget(key, nsems, permflags); retval = semctl(sem_id, sem_num, command, ctl_arg); semget È£ÃâÀº msgget °ú À¯»çÇÏ´Ù. Àμö nsems´Â ¼¼¸¶Æ÷¾î ÁýÇÕ¿¡ ÇÊ¿äÇÑ ¼¼ ¸¶Æ÷¾îÀÇ °¹¼ö¸¦ ³ªÅ¸³½´Ù. semget È£ÃâÀÌ ¼º°øÇÏ¸é ¼¼¸¶Æ÷¾î ÁýÇÕ ½Äº°ÀÚ¶ó´Â ¸Þ½ÃÁö Å¥ ½Äº°ÀÚ¿Í À¯»çÇÑ ¿ªÇÒÀ» ÇÏ´Â °ªÀÌ µ¹¾Æ¿Â´Ù. C ¾ð¾îÀÇ °ü½ÀÀ» µû¶ó ¼­ ¼¼¸¶Æ÷¾î ÁýÇÕ¿¡ ´ëÇÑ Ã¸ÀÚ´Â 0 ºÎÅÍ nsems-1 ±îÁö ÀÖÀ» ¼ö ÀÖ´Ù. ÁýÇÕ ³» ÀÇ °¢ ¼¼¸¶Æ÷¾î´Â ´ÙÀ½°ú °°Àº °ªµéÀ» °®°Ô µÈ´Ù. semval ¼¼¸¶Æ÷¾îÀÇ °ªÀ¸·Î¼­ Ç×»ó ¾ç¼ö°¡ ÁöÁ¤µÈ´Ù. sempid ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇß´ø ÃÖ±ÙÀÇ ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ½Äº°¹øÈ£ÀÌ´Ù. semncnt ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ ÇöÀ纸´Ù Áõ°¡Çϱ⸦ ±â´Ù¸®´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö semzcnt ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ 0 À¸·Î µÇ±â±îÁö ±â´Ù¸®´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö Á¤ÀÇ¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ ÇÔ¼ö semctl Àº msgctlº¸´Ù ÈξÀ º¹ÀâÇÏ´Ù. sem_id ´Â À¯È¿ÇÑ ¼¼¸¶Æ÷¾î ½Äº°ÀÚ¶ó¾ß ÇÑ´Ù. command ´Â msgctl ¿¡¼­¿Í °°ÀÌ ¼öÇàÇØ¾ß ÇÒ Á¤È®ÇÑ ±â´ÉÀ» ¸í½ÃÇÑ´Ù. semctl ±â´ÉÄÚµå -------------------------------------------- Ç¥ÁØ IPC ±â´É(semid_ds ±¸Á¶´Â sem.h¿¡ Á¤ÀÇµÊ -------------------------------------------- IPC_STAT »óÅÂÁ¤º¸¸¦ ctl_arg.stat ¿¡ ÀúÀå IPC_SET ctl_arg.stat ¿¡ ÀúÀåµÈ ÇüÅ·Π¼ÒÀ¯ ±Ç°ú »ç¿ë Çã°¡±ÇÀ» ÁöÁ¤ IPC_RMID ½Ã½ºÅÛ¿¡¼­ ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ ÁýÇÕÀ» »èÁ¦ -------------------------------------------- ´ÜÀÏ ¼¼¸¶Æ÷¾î ¿¬»ê ( retval ¿¡¼­ ³Ñ¾î¿Â °ª sem_unm À» »ç¿ë ) -------------------------------------------- GETVAL ¼¼¸¶Æ÷¾îÀÇ °ª semval À» µ¹·ÁÁØ´Ù. SETVAL ¼¼¸¶Æ÷¾î °ªÀ» ctl_arg.val ·Î ÁöÁ¤ GETPID sempid ÀÇ °ªÀ» µ¹·ÁÁØ´Ù. GETNCNT semncnt ¸¦ µ¹·ÁÁØ´Ù. GETZCNT semzcnt ¸¦ µ¹·ÁÁØ´Ù. -------------------------------------------- Àüü ¼¼¸¶Æ÷¾î ¿¬»ê -------------------------------------------- GETALL ¸ðµç senvals ÀÇ °ªÀ» ctl_arg.array ¿¡ ÀúÀåÇÑ´Ù. SETALL ctl_arg.array ÀÇ °ªÀ» »ç¿ëÇÏ¿© ¸ðµç semvals °ªÀ» ÁöÁ¤ÇÑ´Ù. -------------------------------------------- ¼¼¸¶Æ÷¾î ¿¬»ê : semop È£Ãâ semop È£Ãâ semop Àº ±âº»ÀûÀÎ ¼¼¸¶Æ÷¾î ¿¬»êÀ» ½ÇÁ¦·Î ¼öÇàÇÏ´Â ½Ã½ºÅÛÈ£Ãâ ÀÌ´Ù. À̶§ semop Àº ¸Þ´º¾óÀÇ Ç׸ñÀÌ ¾Æ´Ï¶ó ½ÇÁ¦ ÇÔ¼öÀ̸§ÀÌ´Ù. #include #include #include int retval, sem_id; struct sembuf op_array[SOMEVALUE]; . . retval = semop(sem_id, op_array, SOME VALUE); sem_id ´Â ¼¼¸¶Æ÷¾î ÁýÇÔ ½Äº°¾î·Î¼­ ÀÌÀü¿¡ semget È£ÃâÀ» ÅëÇØ °ªÀÌ ÁöÁ¤µÇ ¾î¾ßÇÑ´Ù. op_array ´Â sembuf ±¸Á¶ÀÇ ¹è¿­·Î¼­ sembuf ±¸Á¶´Â sem.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. SOMEVALUE ´Â ÀÓÀÇÀÇ Á¤¼öÇü »ó¼öÀÌ´Ù. °¢°¢ÀÇ sembuf ±¸Á¶ º¯¼ö´Â ¼¼¸¶Æ÷¾î¿¡ ´ëÇØ ¼öÇàÇÒ ¿¬»êÀ» ÁöÁ¤ÇÑ´Ù. sembuf ±¸Á¶¸¦ Á»´õ ÀÚ¼¼È÷ º¸¸é ´Ù À½°ú °°´Ù. short sem_num; short sem_op; short sem_flg; sem_num ´Â ÁýÇÕ ³»ÀÇ ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Ã·ÀÚ¸¦ ÀúÀåÇÑ´Ù. ¸¸¾à ÁýÇÕÀÇ ¿ø¼Ò°¡ Çϳª»ÓÀ̶ó¸é sem_num ÀÇ °ªÀº 0 À̾î¾ßÇÑ´Ù. sem_op ´Â ÇÔ¼ö semop ÀÌ ¼öÇàÇØ ¾ß ÇÏ´Â ±â´ÉÀ» Á¤¼ö·Î¼­ ³ªÅ¸³½´Ù. SEM_UNDO Ç÷¡±× À̰ÍÀº sembuf ±¸Á¶ÀÇ ±¸¼º¿ä¼Ò sem_flg ¿¡ ÀÖ´Â Ç÷¡±×ÀÇ ÇϳªÀÌ´Ù. ÀÌ´Â ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀÌ ³¡³µÀ» ¶§ ½Ã½ºÅÛÀÌ ¼öÇàµÈ ¿¬»êÀ» ÀÚµ¿ÀûÀ¸·Î Ãë¼ÒÇϵµ·Ï Áö½ÃÇÑ´Ù. 7.3.4. °øÀ¯ ¸Þ¸ð¸® °øÀ¯ ¸Þ¸ð¸® ¿¬»êÀº µÑ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ½ÇÁ¦ ¸Þ¸ð¸®ÀÇ ÀϺθ¦ °øÀ¯ÇÏ°Ô ÇØ ÁØ´Ù(¹°·Ð º¸ÅëÀÇ °æ¿ì¿¡´Â ¼­·Î ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ Àڷ῵¿ªÀº ¿ÏÀüÈ÷ µ¶¸³ÀûÀÌ ´Ù). ÀÌ ±â¹ýÀº ¼¼°¡Áö IPC ±â´É Áß¿¡¼­ °¡Àå È¿À²ÀûÀÌ´Ù. ¸ðµç °øÀ¯ ¸Þ¸ð¸® ¿¬»êÀº Ưº°ÇÑ Çϵå¿þ¾îÀÇ Áö¿øÀ» ÇÊ¿ä·Î ÇÑ´Ù. sbmget ¿Í shmop ½Ã½ºÅÛ È£Ãâ °øÀ¯ÇÏ´Â ¸Þ¸ð¸® ¿µ¿ªÀº shmget È£ÃâÀ» ÅëÇØ »ý¼ºµÈ´Ù. #include #include #include key_t key; int size, permflags, shm_id; . . shm_id = shmget(key, size, permflags); ÀÌ´Â msgget À̳ª semget °ú ´ëÀÀµÈ´Ù. Àμö size ´Â °øÀ¯ÇÒ ¸Þ¸ð¸® ¿µ¿ªÀÇ ÇÊ¿äÇÑ ÃÖ¼Ò Å©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ³ªÅ¸³½ Ä¿¼­ÀÌ´Ù. key ´Â ¿µ¿ªÀ» ½Äº°Çϱâ À§ÇÑ Å° °ªÀÌ´Ù. permflag ´Â ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇÑ »ç¿ë Çã°¡±ÇÀ¸·Î¼­, msgget À̳ª semget ÀÇ °æ¿ìµÂ °°ÀÌ IPC_CREAT ¿Í IPC_EXCL ¸¦ »ç¿ëÇÏ¿© ÁöÁ¤ÇÒ ¼ö ÀÖ ´Ù. »ý¼º µÇ´Â ¸Þ¸ð¸® ¿µ¿ªÀº ÇÁ·Î¼¼½ºÀÇ ³í¸®Àû ÀÚ·á ¿µ¿ªÀÌ ¾Æ´Ï¶ó ½ÇÁ¦ ¸Þ ¸ð¸®ÀÇ ÀϺÎÀÌ´Ù. #include #include #include int shm_id, shmflags; char *memptr, *daddr, *shmat(); . . memptr = shmat(shm_id, daddr, shmflags); shmat ´Â shm_id °¡ ÁöÁ¤ÇÏ´Â ¸Þ¸ð¸® ¿µ¿ª(shmget È£Ãâ¿¡ ÀÇÇØ ¾ò¾îÁü)°ú È£ Ãâ ÇÁ·Î¼¼½º ÀÇ À¯È¿ÇÑ ÁÖ¼Ò¸¦ ¿¬°ü Áþ´Â´Ù. daddr ´Â È£Ãâ¿¡¼­ ¼±ÅõǴ ÁÖ¼Ò ¸¦ ÇÁ·Î±×·¡¸Ó °¡ Á¦¾îÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. shmflags ÀÇ °ªÀº µÎ °³ÀÇ Ç÷¡±× SHM_RDONLY ¿Í SHM_RND ¸¦ Á¶ÇÕÇÏ ¿© Á¤ÇØÁø´Ù. shmctl ½Ã½ºÅÛ È£Ãâ #include #include #include int shm_id, retval, command; struct shmid_ds shm_stat; . . retval = shmctl(shm_id, command, &shm_stat ); À̰ÍÀº msgctl °ú Á¤È®È÷ ÀÏÄ¡ÇÑ´Ù. command °¡ ÃëÇÒ ¼ö ÀÖ´Â °ªÀº IPC_STAT, IPC_SET ±×¸®°í IPC_RMID ÀÌ´Ù. 7.3.5. ipcs ¿Í ipcrm ¸í·É IPC ¼³ºñ¸¦ ÀÌ¿ëÇϱâ À§ÇØ ½© ¼öÁØ¿¡¼­´Â µÎ°³ ÀÇ ¸í·É¾î¸¦ Á¦°øÇÑ´Ù. ù°´Â ipcs ·Î¼­ IPC ¼³ºñÀÇ ÇöÀç »óÅ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. µÑ°´Â ipcrm ¸í·ÉÀ¸·Î¼­ ½Ã½ºÅÛ¿¡¼­ IPC °´Ã¼ ¸¦ Á¦°ÅÇϱâ À§ÇØ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, $ipcrm -s 0 ´Â ½Äº°ÀÚ 0 °ú ¿¬°üµÈ ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÑ´Ù.¶Ç $ipcrm -S 200 ´Â ۰ªÀÌ 200 ÀÎ ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÑ´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 60¹ø Á¦ ¸ñ:[moohou] Unix System Programming 8 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:41 ÀÐÀ½:3484 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- _________________________________________________________________________ Unix System Programming 8 - ±è¼ºÈ£(moohou) _________________________________________________________________________ Á¦8Àå. ´Ü¸»±â 8.1. ¼­·Ð ÇÁ·Î±×·¥°ú »ç¿ëÀÚ°¡ ´Ü¸»±â¸¦ ÅëÇØ ±³½ÅÇÒ ¶§´Â ¾ðÁ¦³ª º¸±âº¸´Ù ÈξÀ ¸¹Àº ÀϵéÀÌ ¹ú¾îÁø´Ù. ¿¹¸¦ µé¾î ÇÁ·Î±×·¥ÀÌ ´Ü¸»±â ÀåÄ¡¿¡ ¹®ÀÚ¿­À» ¾µ ¶§ ÀÌ ¹® ÀÚ¿­Àº ´Ü¸»±â ÀåÄ¡ ±¸µ¿±â¶ó´Â Ä¿³ÎÀÇ ÇѺκп¡ ÀÇÇØ ¿ì¼± 󸮵ȴÙ. ½Ã½ºÅÛ ÀÌ À¯ÁöÇÏ´Â »óÅ Ç÷¡±×°¡ °®´Â °ª¿¡ µû¶ó¼­, ¹®ÀÚ¿­Àº Ãà¾àµÈ ÇüÅ·ΠÀü´ÞµÇ ±âµµ ÇÏ°í ±¸µ¿±â¿¡ ÀÇÇØ º¯ÇüµÇ±âµµ ÇÑ´Ù. - ÇÁ·Î±×·¥ ÀÌ´Â Ãâ·Â ¹®ÀÚ¿­À» »ý¼ºÇϰí ÀÔ·Â ¹®ÀÚ¿­À» ÇØ¼®ÇÑ´Ù. - ´Ü¸»±â ÀåÄ¡ ±¸µ¿±â ÀÌ´Â kernel ÀÇ ÀϺÎ, Áï ¼ÒÇÁÆ®¿þ¾îÀÇ ÀÏÁ¾ÀÌ´Ù. ±¸µ¿±âÀÇ ÁÖ¿äºÎºÐÀº ÄÄÇ»ÅͰ¡ ´Ü¸»±â¿Í Åë½ÅÇϵµ·Ï ÇØ Áִ ƯÁ¤ Çϵå¿þ¾î¿Í »óÈ£ÀÛ¿ëÀ» ÇÑ´Ù. ´Ü ¸»±â ÀåÄ¡ ±¸µ¿±âÀÇ ÁÖ¿ä ±â´ÉÀº ÇÁ·Î±×·¥°ú ´Ü¸»±â ÀåÄ¡ »çÀÌ¿¡ ÀڷḦ Àü´Þ ÇÏ´Â °ÍÀÌ´Ù. - Űº¸µå¿Í È­¸é ÀÌµé µÎ ³ëµå´Â ´Ü¸»±â ÀÚü¸¦ ³ªÅ¸³»¸ç ´Ü¸»±â°¡ µÎ°¡Áö Ãø¸éÀ» °®°í ÀÖ À½À» °­Á¶ÇÑ´Ù. ´Ü¸»±âÀÇ Å°º¸µå´Â ÀÔ·Â ÀåÄ¡¿¡ ÇØ´çÇϰí È­¸éÀº Ãâ·ÂÀåÄ¡·Î ÀÛµ¿ÇÑ´Ù. µÎ°¡Áö ÁÖÀÇÇÒ Á¡ÀÌ ÀÖ´Ù. ù°, ¿ì¸®´Â UNIX¿¡¼­ »ç¿ëµÇ´Â ´Ü¸»±âÀÇ ´ëºÎºÐ ÀÎ ºñµ¿±â½Ä ´Ü¸»±â ¸¸À» ´Ù·é´Ù. µÑ°, UNIX ³ª ±× º¯Áß¿¡¼­ÀÇ ´Ü¸»±â Á¶ÀÛÀº ¼­·Î ÀÏÄ¡ÇÏÁö ¾Ê´Â °ÍÀ¸·Î ¾Ç¸íÀÌ ³ô´Ù. 8.2. UNIX ´Ü¸»±â Á¦ 4 Àå¿¡¼­ ¾ð±ÞÇßµíÀÌ ´Ü¸»±â´Â Ư¼öÈ­ÀÏ·Î ÀνĵȴÙ. (±×¸®°í ´Ü¸»±âÀÇ Æ¯ ¼º»ó ¹®ÀÚ ÀåÄ¡ ·Î¼­ Ãë±ÞµÈ´Ù). ´Ü¸»±â À̸§À¸·Î´Â ´ÙÀ½ÀÇ °Í µéÀÌ ¸¹ÀÌ ¾²ÀÎ ´Ù. /dev/console /dev/tty01 /dev/tty02 /dev/tty03 tty ´Â ´Ü¸»±â¸¦ ÁöĪÇÏ´Â UNIX ¿ë¾îÀÌ´Ù. 8.2.1. Á¦¾î ´Ü¸»±â ÇÁ·Î¼¼½ºÀÇ Ç¥ÁØ È­ÀÏ ±â¼ú¾î¸¦ ÅëÇÏ¿© Á¢±ÙÇÒ ¼ö ÀÖ´Â ´Ü¸»±â¸¦ ÇÁ·Î¼¼½º¿Í ÇÁ·Î¼¼½º ±×·ìÀÇ Á¦¾î ´Ü¸»±â¶ó ÇÑ´Ù. ÇÁ·Î¼¼½º°¡ ÀÚ½ÅÀÇ È­ÀÏ ±â¼ú¾î »óÅÂ¿Í ¹«°ü ÇÏ°Ô Á¦¾î ´Ü¸»±â¿¡ Á¢±ÙÇÏ·Á¸é /dev/tty ¶õ È­ÀÏÀ̸§À» »ç¿ëÇÏ¸é µÈ´Ù. ÀÌ´Â Ç×»ó ÇÁ·Î¼¼½º ÀÇ ÇöÀç Á¦¾î ´Ü¸»±â¸¦ °¡¸®Å²´Ù. 8.2.2. ÀÚ·áÀü¼Û ´Ü¸»±â ÀåÄ¡ ±¸µ¿±â´Â ÇÁ·Î±×·¥°ú ´Ü¸»±â ÀåÄ¡ »çÀÌ¿¡ ¹®ÀÚ¸¦ Àü´ÞÇÏ´Â °ÍÀÌ ÁÖ ÀÓ¹«ÀÌ´Ù. 8.2.3. ¹ÝÇâ°ú ¹Ì¸® Ãijֱ⠰¡Àå ±âÃÊÀûÀÎ ÆíÀÇ ±â´ÉÀ¸·Î´Â ¹®ÀÚÀÇ ¹ÝÇâ(echoing)À» ²ÅÀ»¼ö ÀÖ´Ù. ÀÌ´Â »ç¿ëÀÚ°¡ Űº¸µå ¿¡¼­ ¹®ÀÚ 'A' ¸¦ Ä¥¶§ È­¸é¿¡ 'A' °¡ ³ªÅ¸³ª°Ô ÇÏ´Â ±â´ÉÀÌ ´Ù. ÀÌ´Â ÇÁ·Î±×·¥ÀÌ È­¸é¿¡ Ãâ·Â ÇÏ´Â µµÁß¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÀ» ÇÏ´Â °æ¿ì¿¡ Ãâ·Â ÀÇ Áß°£¿¡ ÀÔ·ÂÀÇ ¹ÝÇâÀÌ ³ªÅ¸³ª´Â »óȲÀ» ÃÊ·¡ ÇÑ´Ù. ´Ù¸¥ ½Ã½ºÅÛÀÇ °æ ¿ì¿¡´Â ÇÁ·Î±×·¥ÀÌ ÀÔ·Â À» ÀÐÀ» Áغñ¸¦ °®Ãâ ¶§±îÁö ¹ÝÇâÀÌ ¾ïÁ¦µÈ´Ù. 8.2.4. ±ÔÁظðµå, ¶óÀÌÆíÁý, Ư¼ö¹®ÀÚ. UNIX ±¸µ¿±â´Â ´Ü¼øÇÏ°í ¶óÀÎ Áß½ÉÀÌ¸ç ´ëÈ­½ÄÀÎ ¿ëµµ¿¡ Ưº°È÷ ¸ÂÃá ÀÛµ¿ ¸ð µå¸¦ Á¦°øÇÑ´Ù. ÀÌ´Â ±ÔÁØ ¸ðµå(canonical mode)¶ó ÇÏ¸ç ½©À̳ª ed ÆíÁý±â, ±× ¸®°í ±âŸ À¯»çÇÑ ÇÁ·Î±×·¥¿¡¼­ ¸¹ÀÌ »ç¿ëµÈ´Ù. ±ÔÁظðµå¿¡¼­ »ç¿ëµÇ´Â ÆíÁý Ű Áß °¡Àå Ä£¼÷ÇÑ °ÍÀº erase ¹®ÀÚÀÌ´Ù. À̸¦ ´©¸£¸é ÇØ´ç ¶óÀÎÀÇ ¾Õ¼­ÀÇ ¹® ÀÚ°¡ Áö¿öÁø´Ù. $whpo ½© ¼öÁØ¿¡¼­ À̸¦ Á¤ÇÏ´Â ¹æ¹ýÀº stty ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. $stty erase "^h" ´Â erase ¹®Àڷμ­ CTRL-H ¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ´Â backspase ÀÇ ¶Ç ´Ù¸¥ À̸§ÀÌ ´Ù. À̶§ CTRL-H ¹®ÀÚ¸¦ Á÷Á¢ ÀÔ·ÂÇÏÁö ¾Ê¾Æµµ ¹®ÀÚ¿­ '^h' ¸¦ »ç¿ëÇÏ¸é µÈ´Ù ´Â »ç½Ç¿¡ ÁÖ¸ñÇ϶ó. erase, kill, ¶Ç´Â eof ¹®ÀÚÀÇ Æ¯¼ö Àǹ̸¦ Á¦°ÅÇÏ·Á¸é ¹Ù·Î ¾Õ¿¡ ¿ª ½½·¡½¬ ¹®ÀÚ(\)¸¦ »ç¿ëÇÑ´Ù. ÀÌ °æ¿ì¿¡´Â Ư¼ö ¹®ÀÚ¿¡ °áºÎµÈ ±â ´ÉÀÌ ¼öÇàµÇÁö ¾Ê°í ¹®ÀÚ ÀÚü°¡ ÇÁ·Î±×·¥À¸ ·Î Àü´ÞµÈ´Ù. aa\bc Àº ´Ü¸»±â¿¡¼­ ÀÔ·ÂÀ» ¾ò´Â ÇÁ·Î±×·¦¿¡°Ô aa\c ·Î Àü´ÞµÈ´Ù. 8.3. ÇÁ·Î±×·¥ÀÇ °üÁ¡ Áö±ÝºÎÅÍ´Â ´Ü¸»±â¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÇ °üÁ¡¿¡¼­ »ìÆìº¸ÀÚ. 8.3.1. open ½Ã½ºÅÛ È£Ãâ open Àº º¸ÅëÀÇ µð½ºÅ© È­Àϰú ¸Å¿ì À¯»çÇÑ ¹æ¹ýÀ¸·Î ´Ü¸»±â¸¦ °³¹æÇϴµ¥ »ç ¿ëµÈ´Ù. fd = open("/dev/tty0a", O_RDWR); 8.3.2. read ½Ã½ºÅÛ È£Ãâ È­ÀÏ¿¡ Á¢±ÙÇÏ´Â ±âº» È£Ãâ Áß¿¡¼­ ´Ü¸»±â Ư¼ö È­ÀÏÀ» »ç¿ëÇÏ´Â °æ¿ì¿¡ °¡Àå Å« ¿µÇâÀ» ¹Þ´Â °ÍÀÌ read ½Ã½ºÅÛ È£ÃâÀÌ´Ù. read È£ÃâÀº Ç×»ó newline ÀÌ ÀÔ ·ÂµÇ¾î¾ß ³¡³­´Ù. nread = read(0, buffer, 256); 8.3.3. write ½Ã½ºÅÛ È£Ãâ ÀÌ´Â ´Ü¸»±â¿Í ÇÔ±ú »ç¿ëµÇ´Â ÇÑ ¸Å¿ì °£´ÜÇÏ°Ô ¼öÇàµÈ´Ù. ´ÜÁö Á¦ÇÑÁ¢À̶õ ÇØ´ç ´Ü¸»±âÀÇ Ãâ·Â Å¥°¡ ¸ðµÎ Â÷ ÀÖ´Â °æ¿ì¿¡ write °¡ ºí·°µÇ´Â °Í »ÓÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ¼öÇàÀÌ Àç°³µÇ·Á¸é Å¥¿¡ ³²¾ÆÀÖ´Â ¹®ÀÚµéÀÌ ÀÏÁ¤¼öÁØ ÀÌÇÏ·Î ºüÁ® ³ª°¡¾ß ÇÑ´Ù. 8.3.4. ttyname °ú isatty ttyname Àº °³¹æµÈ ´Ü¸»±â È­ÀÏ ±â¼ú¾îÀÇ ÇØ´ç ´Ü¸»±â ÀåÄ¡¿¡ ´ëÇÑ À̸§À» µ¹ ·ÁÁØ´Ù. isatty ´Â È­ÀÏ ±â¼ú¾î°¡ ´Ü¸»±â ÀåÄ¡ÀÇ °ÍÀ̸é 1 À», ¾Æ´Ï¸é 0 À» µ¹ ·ÁÁØ´Ù. int filedes, bool; char *name, *ttyname(); . . name = ttyname(filedes); bool = isatty(filedes); µÎ±âÁö °æ¿ì ¸ðµÎ filedes ´Â °³¹æµÈ È­ÀÏ ±â¼ú¾î¸¦ ³ªÅ¸³½´Ù. filedes °¡ ´Ü ¸»±â¸¦ ³ªÅ¸³»Áö ¾ÊÀ¸¸é ttynam Àº NULL À» µ¹·ÁÁØ´Ù. 8.3.5. termio ±¸Á¶¸¦ »ç¿ëÇÏ¿© ´Ü¸»±â Ư¼ºÀ» º¯°æÇÏ´Â ¹ý ½©¿¡¼­´Â ´Ü¸»±âÀÇ Æ¯¼ºÀ» º¯°æÇϱâ À§ÇÏ¿© stty ¸í·ÉÀ» »ç¿ëÇß´Ù. ÇÁ·Î±×·¥ ¿¡¼­´Â ioctl ½Ã½ºÅÛ È£Ãâ°ú termino ±¸Á¶¸¦ »ç¿ëÇÏ¿© °°Àº ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù. - »ý·« 8.3.6. MIN °ú TIME Àμö Àμö MIN °ú TIME Àº Ç÷¡±× ICANON ÀÌ 0 À϶§¸¸ È¿·ÂÀ» °®´Â´Ù. À̵éÀº ÀÚ·á ÀÇ ÀÔ·Â, Áï read È£Ãâ¿¡ ´ëÇÑ ÇÁ·Î±×ÀÇ Á¦¾î±ÇÀ» Á¤¹ÐÇÏ°Ô Á¶Á¤ÇÑ´Ù. MIN Àº ´Ü¸»±â¿¡ ´ëÇÑ read È£ÃâÀÌ ³¡³ª±â Àü¿¡ ´Ü¸»±â ±¸µ¿±â°¡ ¹Þ¾Æ µé¿©¾ß ÇÏ´Â ¹® ÀÚÀÇ ÃÖ¼Ò °¹¼ö¸¦ ³ªÅ¸³½´Ù. TIME ´Â ¶Ç ´Ù¸¥ Á¦¾î±ÇÀ¸·Î¼­ ½Ã°£ Á¾·áÀÇ ±â°£ À» ³ªÅ¸ ³½´Ù. MIN °ú TIME ÀÇ °ª¿¡´Â ´ÙÀ½ÀÇ 4 °¡Áö °æ¿ì°¡ ÀÖÀ» ¼ö ÀÖ´Ù. 1. MIN °ú TIME ¸ðµÎ 0 À϶§. ÀÌ ¶§´Â read È£ÃâÀÌ Ç×»ó Áï½Ã ³¡³­´Ù. ÇØ´ç ´Ü¸»±âÀÇ ÀԷ ť¿¡ ¹®ÀÚ°¡ µé ¾î ÀÖÀ¸¸é(ÀÔ·ÂÀº ¾Æ¹«¶§°í µµÂøÇÑ´Ù´Â °ÍÀ» »ó±âÇ϶ó), ÇÁ·Î±×·¥ ¹öÆÛ¿¡ ¿Å °ÜÁø´Ù. 2. MIN Àº 0 º¸´Ù ÄÚ°í TIME Àº 0 °ú °°À»¶§. ÀÌ °æ¿ì¿¡´Â ŸÀ̸Ӱ¡ ¾Æ¹« ¿ªÇÒµµ ÇÏÁö ¾Ê´Â´Ù. read È£ÃâÀÌ ³¡¸¶ÃÄ Áö·Á¸é ÀÐÇôÁö±æ ±â´Ù¸®´Â ¹®ÀÚ°¡ MIN ¸¸Å­Àº ÀÖ¾î¾ß ÇÑ´Ù. 3. MIN Àº 0 À̰í TIME Àº 0 º¸´Ù Ŭ¶§. ÀÌ °æ¿ì MIN Àº ¾Æ¹«Àϵµ ÇÏÁö ¸øÇÑ´Ù. ŸÀ̸Ӵ read °¡ È£ÃâµÇ´Â ¼ø°£ºÎÅÍ ÀÛµ¿ÇÑ´Ù. 4. MIN °ú TIME ¸ðµÎ 0 º¸´Ù Å« °æ¿ì. ÀÌ °æ¿ì°¡ °¡Àå À¯¿ëÇÏ°íµµ À¯¿¬¼ºÀÌ ÀÖ´Ù. ŸÀ̸Ӱ¡ ÀÛµ¿µÇ´Â ¼ø°£Àº ÀÌÁ¦ ´Â read °¡ È£ÃâµÈ ¼ø°£ÀÌ ¾Æ´Ï¶ó ù¹øÂ° ¹®ÀÚ°¡ µé¾î¿ÔÀ» ¶§ÀÌ´Ù. ½Ã°£ÀÌ Á¾·áµÇ¸é ±× ¼ø°£±îÁö ÀԷ ť ¿¡ ÀÖ´Â ¹®Àڵ鸸ÀÌ ÇÁ·Î±×·¥¿¡ Àü´ÞµÈ´Ù. 8.3.7. ioctl ½Ã½ºÅÛ È£Ãâ ioctl Àº ¹®ÀÚÇü Ư¼ö È­ÀÏÀÌ ³ªÅ¸³»´Â ¿ÜºÎÀåÄ¡¸¦ Á¦¾îÇϱâ À§ÇÑ ´Ù¸ñÀû È£ Ãâ·Î¼­ ÀμöÀÇ À¯ÇüÀÌ ¸Å¿ì ´Ù¾çÇÏ´Ù. ´Ü¸»±â¿¡ ´ëÇÑ ioctl È£ÃâÀº Å©°Ô ±âº» È£Ãâ°ú Ãß°¡È£ÃâÀÇ µÎ°¡Áö À¯ÇüÀ¸·Î ºÐ¸®µÈ´Ù. ±âº»È£ÃâÀÇ »ç¿ë¹ýÀº ´ÙÀ½°ú °° ´Ù. #include struct termio targ; int ttyfd, cmd, retval; . . retval = ioctl(ttyfd, cmd, &targ); ttyfd ´Â ´Ü¸»±â¿¡ ´ëÇÑ °³¹æµÈ È­ÀÏ ±â¼ú¾î¶ó¾ß ÇÑ´Ù. targ ´Â termio ±¸Á¶ ÀÇ º¯¼· ´Ü¸»±âÀÇ »óŸ¦ ÀúÀåÇÑ´Ù. Àμö cmd ´Â ioctl ÀÇ ¼öÇà¾ç½ÄÀ» ÁöÁ¤ÇÏ ¸ç termio.h ¿¡ Á¤ÀÇµÈ ¹Ù¿Í °°ÀÌ ´ÙÀ½°ú °°Àº °ªÀ» °¡Áú ¼ö ÀÖ´Ù. TCGETA ÀÌ´Â icctl ÀÌ ´Ü¸»±âÀÇ ÇöÀç»óŸ¦ targ ¿¡ º¹»çÇÏ°Ô ÇÑ´Ù. TCSETA TCGETA ÀÇ ¿ªÀ¸·Î¼­, targ ¿¡ ÀÖ´Â °ªÀ¸·Î ´Ü¸»±âÀÇ »óŸ¦ ÁöÁ¤ÇÑ´Ù. TCSETAW ÀÌ´Â TCSETA ¿Í °°Àº ±â´ÉÀ» ÇÏÁö¸¸ »õ·Î¿î °ªÀ» ÁöÁ¤ÇϱâÀü¿¡ ÇöÀçÀÇ Ãâ·Â Å¥°¡ ºñ¿öÁú ¶§±îÁö ±â´Ù¸°´Ù. TCSETAF ÀÌ´Â TCSETA ÀÇ ¶Ç ´Ù¸¥ ÇüÅ·μ­ Ãâ·Â Å¥°¡ ºñ¿öÁú ¶§±îÁö ±â´Ù¸° ÈÄ¿¡ ÀÔ ·Â Å¥¸¦ û¼ÒÇÏ°í ³­ ´ÙÀ½¿¡¾ß ´Ü¸»±âÀÇ »óŸ¦ targ ÀÇ °ªÀ¸·Î ÁöÁ¤ÇÑ´Ù. ÀÌ´Â ±âº» È£Ãâ°ú Ãß°¡ È£Ãâ °æ¿ì¿¡ ¸ðµÎ Àû¿ëµÈ´Ù. Ãß°¡ÀûÀÎ ioctl È£ÃâÀº ÇÁ·Î±×·¡¸Ó¿¡°Ô ´Ü¸»±â ±¸µ¿±â°¡ °ü¸®ÇÏ´Â ÀÔÃâ·Â Å¥¿¡ ´ëÇÑ ¾î´À Á¤µµÀÇ Á¦¾î ±ÇÀ» ºÎ¿©ÇÑ´Ù. #include int ttyfd, cmd, arg, retval; . . retval = ioctl(ttyfd, cmd, arg); ¿©±â¼­ ttyfd ¿Í cmd ÀÇ Àǹ̴ ¾Õ¿¡¼­ÀÇ °æ¿ì µ¿ÀÏÇÏ´Ù. arg ´Â Á¤¼öÇü·Î Ãß °¡ÀûÀÎ Á¤º¸¸¦ Àü´ÞÇÑ´Ù. Ãß°¡ ioctl È£Ãâ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â cmd ÀÇ °ªÀº ´Ù À½°ú °°´Ù. TCFLSH arg °¡ 0 À̸é ÀԷ ť¸¦ û¼ÒÇÑ´Ù. Áï ÀԷ ťÀÇ ¸ðµç ¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù. arg °¡ 1 À̸é Å¥¸¦ û¼ÒÇÑ´Ù. arg °¡ 2 À̸é ÀÔÃâ·Â Å¥¸¦ ¸ðµÎ û¼ÒÇÑ´Ù. TCXONC À̰ÍÀº ´Ü¸»±â ±¸µ¿±â¿¡ ´ëÇÑ Áß´Ü/Àç°³¸¦ Á¦¾îÇÑ´Ù. arg °¡ 0 ¸é Ãâ·ÂÀÌ ÁߴܵȴÙ. Áß´ÜµÈ Ãâ·ÂÀ» Àç°³ÇÏ·Á¸é arg °ªÀ» 1 ·Î ÇØ¼­ ioctl À» ´Ù½Ã È£ ÃâÇØ¾ß ÇÑ´Ù. TCBRK À̰ÍÀº break ¸¦ Àü¼ÛÇÏ´Â µ¥ »ç¿ëµÈ´Ù. À̰ÍÀº 1/4 Ãʵ¿¾È 0 ºñÆ®µéÀ» Àü ¼ÛÇÏ´Â °Í°ú °°´Ù. ÀÌ ±â´ÉÀº Ãâ·Â Å¥°¡ ºó ´ÙÀ½¿¡¸¸ »ç¿ëµÇ¾î¾ß ÇÑ´Ù. 8.3.8. ´ÜÀý ½Ã±×³Î 6 Àå¿¡¼­ ÇÁ·Î¼¼½º ±×·ì ¸®´õ°¡ Á¦¾î ´Ü¸»±â¸¦ °®°í ÀÖÀ» ¶§ ¼öÇàÀÌ Á¾·áµÇ¸é ÇØ´ç ÇÁ·Î¼¼½º±×·ìÀÇ ±¸¼º¿øµé¿¡°Ô ´ÜÀý ½Ã±×³Î SIGHUP ÀÌ Àü´ÞµÊÀ» º¸¾Ò´Ù. ¿©±â¿¡´Â ¶Ç ´Ù¸¥ ¿ëµµ°¡ À־, ÄÄÇ»ÅÍ¿Í ´Ü¸»±â »çÀÌÀÇ Á¢¼ÓÀÌ ²÷¾îÁ®¼­ ´Ü ¸»±â ¶óÀÎÀÇ ¹Ý¼ÛÆÄ°¡ °ËÃâµÇÁö ¾Ê´Â »óȲÀ» ´ëº¯ ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ »óȲÀº ´Ü¸»±â°¡ ÀüÈ­¼±À̳ª Áö¿ª ³×Æ®¿öÅ©¸¦ »ç¿ëÇÏ¿© ¿¬°áµÈ °æ¿ì¿¡ ¹ß»ýÇÒ ¼ö ÀÖ ´Ù. ÀÌ·± »óȲÀÌ ¹ß»ýÇϸé, ´Ü¸»±â ±¸µ¿±â´Â ÇØ´ç ´Ü¸»±â¸¦ Á¦¾î ´Ü¸»±â·Î ÇÏ ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô SIGHUP À» º¸³½´Ù. (SIGINT¿Í´Â ´Þ¸® SIGHUP Àº ½©À» Á¤ »óÀûÀ¸·Î ·Î±×¾Æ¿ôµÇ°Ô ÇÑ´Ù.) º¸ÅëÀÇ °æ¿ì ÇÁ·Î±×·¡¸Ó´Â SIGHUP ¿¡ ¼Õ´ëÁö ¸» ¾Æ¾ß ÇÑ´Ù. ÀÌ´Â ÈǸ¢ÇÑ ¾ÈÀüÀåÄ¡¸¦ Á¦°øÇÑ´Ù. ±×·¯³ª ¶§¿¡ µû¶ó¼­´Â ÇÁ·Î±×·¥ ÀÌ À̸¦ Æ÷ÂøÇÏ¿© ¸¶¹«¸® ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÒ Çʿ伺ÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. 8.4. connect ÀÇ ¿¹ connect ´Â Åë½Å ÇÁ·Î±×·¥À¸·Î¼­ µÎ°¡Áö ÀÛµ¿¸ðµå¸¦ °®´Â´Ù. Çϳª´Â »ç¿ëÀÚ°¡ µÎ °³ÀÇ UNIX ÄÄÇ»Å͸¦ ¿¬°áÇÏ°Ô ÇØÁØ´Ù. ´Ù¸¥ Çϳª´Â µÎ ÄÄÇ»ÅÍ °£¿¡ ÅØ½ºÆ® È­ÀÏÀ» Àü¼ÛÇÏ°Ô ÇØÁØ´Ù. ¿ì¼± Çì´õÈ­ÀÏ connect.h ¸¦ »ìÆìº¸ÀÚ. ÀÌ È­ÀÏÀº ´Ù ½Ã termio.h ¿Í °°Àº ½Ã½ºÅÛ Çì´õ È­ÀÏÀ» Æ÷ÇÔÇÑ´Ù. À̿ܿ¡µµ ´Ù¼öÀÇ »ó¼ö°¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. ÀÌ Áß¿¡¼­ STARTCOM À̶õ ¹®ÀÚ¿­Àº ÇöÁö ÄÄÇ»ÅÍ¿¡¼­ ¿ø°Ý ÄÄ Ç»ÅÍ·ÎÀÇ ÀÚ·áÀü´ÞÀ» ÃʱâÈ­ Çϴµ¥ »ç¿ëµÈ´Ù. /* header file for connect program */ #include #include #include #include #include #define ERROR (-1) #define SUCCESS 0 #define TRUE 1 #define FALSE 0 #define SENDFILE 1 #define EXIT 2 #define MAXTIME 30 /*1/10ths sec*/ #define STARTCOM\ "mesg n; stty -opost; cat -> %s; stty opost; mesg y" #define CTRLD 004 /*Control-D*/ #define CTRLP 020 /*Control-P*/ #define CTRLY 031 /*Control-y*/ connect ÇÁ·Î±×·¥À» È£Ãâ ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ÁØ´Ù. $connect term-name speed ¿¹¸¦ µé¾î¼­ $connect /dev/ttya 9600 main ¿¡¼­ È£ÃâÇÏ´Â ÇÔ¼ö·Î´Â Ç¥ÁؽýºÅÛ È£Ãâ °ú ¶óÀ̺귯¸®·çƾÀ» Á¦¿ÜÇÏ ¸é, getspeed, ttyopen, cfatal, ±×¸®°í connect µîÀÌ ÀÖ´Ù. ÇÔ¼ö getspeed ´Â ¸í·É¾î ¶óÀÎ ÀμöÀÇ µÎ ¹øÂ° °ÍÀ» ioctl ¿¡ ÀûÇÕÇÑ ÇüÅ·Πº¯È¯ÇÑ´Ù. ttyopen Àº ¾Õ¼­ ¼Ò°³ÇßµíÀÌ ´Ü¸»±â¸¦ °³¹æÇÏ´Â ÇÔ¼öÀÌ´Ù(ttyopen À» ¼öÁ¤ÇÏ¿© connect.h ¿¡ Á¤ÀÇµÈ »ó¼öµéÀ» ÀÌ¿ëÇÏ´Â °Íµµ °í·ÁÇØº¸¶ó). ÇÔ¼ö cfatal Àº ¿À ·ù¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí ÇÁ·Î±×·¥ÀÇ ¼öÇàÀ» ÁߴܽÃŲ´Ù. connect ´Â main ÀÌ È£Ãâ ÇÏ´Â ¸¶Áö¸· ÇÔ¼öÀÌ´Ù. ¿©±â¼­´Â µÎ°³ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ¿© È­ÀÏ Àü¼Û À» ´ã´çÇÏ ´Â ÁßÃßÀû ¿ªÇÒÀ» ÇÑ´Ù. ÇÔ¼ö connect ´Â µÎ°³ÀÇ Àμö°¡ Àִµ¥ ÇÏ ³ª´Â ttyopen ÀÌ °³¹æÇÑ È­Àϱâ¼ú¾îÀ̰í, ´Ù¸¥ Çϳª ´Â getspeed °¡ º¯È¯ÇØ ÁØ Àü¼Û¼ÓµµÀÌ´Ù. ÀÓ¹« ´Â ÇÁ·Î¼¼½º¸¦ µÎ°³ »ý¼ºÇÏ¿© ºÎ¸ð ÇÁ·Î¼¼½º´Â ¿ø°Ý ½Ã½º ÅÛ¿¡¼­ ¿À´Â ¹®ÀÚµéÀ» Àü´ÞÇÏ°Ô Çϰí ÀÚ½Ä ÇÁ·Î¼¼½º´Â ¿ø°Ý ½Ã½ºÅÛ¿¡¼­ ¿À´Â ¹®ÀÚµé À» ¹Þ¾ÆµéÀÌ°Ô ÇÏ´Â °ÍÀÌ´Ù. ÇÊ¿äÇÑ °æ¿ì¿¡´Â ¿ø°Ý ½Ã½ºÅÛÀ¸·Î È­ÀÏ Àü ¼ÛÀ» °³½ÃÇÒ ¼öµµ ÀÖ´Ù. ¿©±â¼­ ¸í½ÉÇÒ »ç½ÇÀÌ ÀÖ´Ù. Çϳª´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼öÇàÇÏ´Â from ÇÔ¼ö´Â Àý´ë´Â ³¡³ªÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­ ºÎ¸ð ÇÁ·Î¼¼½º °¡ kill ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ´Ù¸¥ Çϳª´Â ÇÔ¼ö to °¡ µ¹·ÁÁÖ´Â º¯¼ö status ´Â »ç¿ëÀÚ°¡ ÀÔ·Â ÇÏ´Â ¸í·É¾î¿¡ ÇØ´çÇÑ´Ù´Â °ÍÀÌ´Ù. SENDFILE °ú EXIT °¡ Á¤ ÀÇµÈ °÷Àº ¹°·Ð connect.h ÀÌ´Ù. 8.5. °ú°Å UNIX ¹öÀü 7 °ú °°Àº °æ¿ì¿¡´Â termio ±¸Á¶´Â Á¸ÀçÇÏÁö ¾Ê¾Ò´Ù. ´ë½Å¿¡ ´Ü¸» ±âÀÇ »óŸ¦ ±â¼úÇϱâ À§Çؼ­ º¸´Ù °£´ÙÇÑ ±¸Á¶ sgttyb ¸¦ »ç¿ëÇß´Ù. ÀÌ ±¸Á¶ ÀÇ ÀÚ·áÇüÀ» »ç¿ëÇßÀ»¶§´Â ioctl ÀÇ ±â´ÉÀÌ Á» ´õ Á¦ÇѵǾú¾ú´Ù. ´Ü¸»±âÀÇ Æ¯ ¼ºÀº gtty ¶ó´Â ½Ã½ºÅÛ È£Ãâ¿¡ ÀÇÇØ ¾ò¾îÁö°í stty ¿¡ ÀÇÇØ ÁöÁ¤µÇ¾ú´Ù. 8.6. ±×¸®°í ¹Ì·¡ ½ºÆ®¸²À̶õ º»ÁúÀûÀ¸·Î´Â ÇÁ·Î¼¼½Ì ¸ðµâÀÇ ¼±Çü ±¸Á¶·Î¼­ ½©ÀÇ ÆÄÀÌÇÁ ¶óÀΰú À¯»çÇÏÁö¸¸ ¸ðµâ »çÀÌÀÇ ÀÚ·áÀü´ÞÀÌ ¾ç¹æÇâÀ¸·Î ¸ðµÎ µÉ ¼ö ÀÖ´Â Á¡ÀÌ ´Ù¸£´Ù. ½ºÆ®¸²ÀÇ ÇÑÂÊ ³¡Àº »ç¿ëÀÚ ÇÁ·Î¼¼½º¿¡°Ô ¿¬°áµÇ¾î ÀÖ°í ´Ù¸¥ÂÊ ³¡Àº ½ºÆ®¸³À» À§ÇÑ ÀåÄ¡ ±¸µ¿±â¿¡ ¿¬°áµÈ´Ù. »ç¿ëÀÚ ÇÁ·Î¼¼½º¿¡°Ô °¡Àå °¡±î¿î ¸ðµâÀº ½ºÆ® ¸²¿¡ ´ëÇÑ ÇÁ·Î±×·¡¸ÓÀÇ ÀÎÅÍÆäÀ̽º ¿ªÇÒÀ» ÇÑ´Ù. »ç¿ëÀÚ ÇÁ·Î¼¼½º°¡ write ¸¦ È£ÃâÇϸé ÀÌ´Â ½ºÆ®¸²¿¡ Àü´ÞµÇ´Â ¸Þ½ÃÁö·Î º¯È¯µÇ°í, read ¸¦ È£ÃâµÇ¸é °¡Àå °¡±î¿î ¸ðµâ¿¡¼­ ÀڷḦ ÀÐ¾î µéÀÌ°Ô µÈ´Ù. Àϰü¼ºÀ» À¯ÁöÇϱâ À§Çؼ­ Á¦¾î Á¤ º¸µµ ¸ðµâ°£ÀÇ ¸Þ½ÃÁö¿Í °°Àº ÇüÅ·ΠÀü´ÞµÈ´Ù. ½ºÆ®¸²ÀÌ open È£ÃâÀ» ÅëÇØ °³ ¹æµÇ¸é µÎ°³ÀÇ ¸»´Ü ¸ðµâÀÌ ÀÚµ¿ÀûÀ¸·Î ¿¬°áµÈ´Ù. À̰ÍÀÌ ½ºÆ®¸²ÀÇ °¡Àå ±âº» ÀûÀÎ ÇüÅÂÀ̸ç ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸Å¿ì ¿ø½ÃÀûÀÎ ¼öÁØÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. Ãß°¡ÀûÀÎ ¸ðµâÀÌ ½ºÆ®¸²¿¡ »ðÀԵǷÁ¸é È®ÀåµÈ ÇüÅÂÀÇ ioctl À» È£ÃâÇØ¾ß ÇÑ ´Ù.(´Ü¸»±â°¡ ÃÖÃÊ¿¡ ¸Å¿ì ¿ø½ÃÀû »óÅ·Π°³¹æµÈ´Ù´Â »ç½ÇÀº »ç¿ëÀÚ ¼öÁØÀÇ ÄÚ µå¸¦ ¾à°£ ¼öÁ¤ÇÏ°Ô ¸¸µç´Ù.) ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 61¹ø Á¦ ¸ñ:[moohou] Unix System Programming 9 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:42 ÀÐÀ½:3446 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- _________________________________________________________________________ Unix System Programming 9 - ±è¼ºÈ£(moohou) _________________________________________________________________________ Á¦9Àå. Ç¥ÁØ I/O ¶óÀ̺귯¸® 9.1. ¼­·Ð ¿ì¼± Dennis Ritche °¡ ÃÖÃÊ·Î °³¹ßÇϰí, ¸ðµç UNIX ½Ã½ºÅÛ¿¡¼­ Á¦°øµÇ´Â C ¶óÀ̺귯¸®ÀÇ Áß¿äÇÑ ºÎºÐÀΠǥÁØ I/O ¶óÀ̺귯¸®¸¦ »ìÆìº»´Ù. Ç¥ÁØ I/O ·éƾ µéÀº UNIX ÀÇ Æ¯Á¤ÇÑ Æ¯¼º¿¡ ¸Å¾î ÀÖÁö ¾Ê°í C ¾ð¾î¸¦ À§ÇÑ ANSI Ç¥ÁØÀÇ ÀϺΠºÐÀÌ µÈ´Ù´Â Àǹ̿¡¼­ À̽İ¡´ÉÇÏ´Ù. Á¦´ë·Î µÈ C ÄÄÆÄÀÏ·¯¶ó¸é ¿î¿µÃ¼Á¦¿¡ °ü °è¾øÀÌ Ç¥ÁØ I/O ¶óÀ̺귯¸®ÀÇ ¿ÏÀüÇÑ ±¸ÇöÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô ÇÒ °ÍÀÌ´Ù. ¾ÕÀ¸ ·Î ¶óÀ̺귯¸®ÀÇ UNIX ±¸Çö°ú Ư¼º, ½Ã½ºÅÛ ÇÁ·Î±×·¡¸Ó¿Í ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ¸¦ À§ÇÑ À¯¿ë¼º¿¡ ´ëÇÏ¿© »ìÆìº¸ÀÚ. 9.2. ½ºÆ®¸²°ú FILE ±¸Á¶ Ç¥ÁØ I/O ·çƾµéÀº ½ºÆ®¸²À̶ó°í ÇÏ´Â ¿£Æ¼Æ¼(entity)¸¦ ÅëÇØ È­ÀÏ¿¡ Á¢±ÙÇÑ ´Ù. º»ÁúÀûÀ¸·Î ÇϳªÀÇ ½ºÆ®¸²Àº ÇÁ·Î±×·¥°ú °³¹æ È­ÀÏ»çÀÌÀÇ ÀÚ·áÀÇ È帧ÀÌ ´Ù. ÇÁ·Î±×·¥³»¿¡¼­ ½ºÆ®¸²Àº FILE ÇüÀÇ ±¸Á¶¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿¡ ÀÇÇØ ½Äº°µÈ´Ù. FILE ÀÇ Á¤ÀǴ ǥÁØ Çì´õ È­ÀÏ stdio.h ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. typedef struct _iobuf { int _cnt; unsigned char *_ptr; unsigned char *_base; char _flag; char _file; } FILE; _file Àº char ·Î¼­ ¼±¾ðµÇ¾úÀ¸³ª ½ÇÁ¦·Î´Â 'ÀÛÀº' ÇÑ ¹ÙÀÌÆ® Á¤¼ö·Î¼­ Ãë±Þ µÈ´Ù. À̰ÍÀº FILE ±¸Á¶¿¡ ÀÇÇØ ½Äº°µÇ´Â ½ºÆ®¸²ÀÌ È­Àϰú ¿¬°áµÉ¶§ È­ÀÏ ±â¼ú ¾î¸¦ ³ªÅ¸³¾ °ÍÀÌ´Ù. À̰ÍÀº Ç¥ÁØ I/O °¡ ±Ã±ØÀûÀ¸·Î È­ÀÏ Á¢±Ù ÇÁ¸®¹ÌƼºê open, read, write, close µîÀ» »ç¿ëÇÑ´Ù´Â »ç½ÇÀ» ¸í½ÃÀûÀ¸·Î ³ªÅ¸³»´Â °ÍÀÌ ´Ù. ±×°ÍÀº Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÇÇÑ ³»ºÎÀû »ç¿ëÀ» À§ÇÑ °ÍÀÌ´Ù. _flag ´Â ½ºÆ®¸²À» À§ÇÑ Á¦¾îÁ¤º¸¸¦ Æ÷ÇÔÇÑ´Ù. ¿¹¸¦µé¾î À̰ÍÀº Ç¥ÁØ I/O ¶óÀ̺귯¸®°¡ ÇØ´ç ½ºÆ®¸²ÀÌ ¾²±â, Àб⠶Ǵ µÑ´Ù¸¦ À§ÇØ °³¹æµÈ °ÍÀÎÁö¸¦ ³ªÅ¸³½´Ù. _ptr, _cnt ¿Í _base ´Â °³¹æ ½ºÆ®¸²°ú °ü·ÃµÈ ¹®ÀÚ ¹öÆÛ¸¦ ³ªÅ¸³½´Ù. _base ´Â ¹öÆÛ ÀÇ ½ÃÀÛÁ¡ À» °¡¸®Å²´Ù. _ptr Àº 󸮸¦ À§ÇØ »ç¿ë°¡´ÉÇÑ ¹öÆÛÀÇ ´ÙÀ½ ¹®ÀÚ¸¦ °¡¸®Å°°í, Á¤¼ö _cnt ´Â _ptr °¡ ³ªÅ¸³»´Â À§Ä¡ ÀÌÈÄ¿¡ ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â ¹®ÀÚ ÀÇ ¼ö¸¦ ³ªÅ¸³½´Ù. ¹öÆÛÀÇ Å©±â´Â BUFSIZ ¹ÙÀÌÆ®°¡ µÈ´Ù. BUFSIZ ÀÚü´Â stdio.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ°í, 2 Àå¿¡¼­ º¸¾ÒµíÀÌ È£½ºÆ®È¯°æÀ» À§ÇÑ µð½ºÅ© ºí ·°Å· ¿ä¼Ò¸¦ Á¤ÇØÁØ´Ù. ÀüÇüÀûÀÎ °ªÀº 512 ¿Í 1024 µîÀÌ´Ù. 9.3. ½ºÆ®¸²À» ¿­°í ´Ý±â : fopen °ú fclose #include FILE *stream; char *filename, *type; int retval; . . stream = fopen(filename, type); retval = fclose(stream); fopen °ú fclose ´Â open °ú close ¿¡ ÇØ´çÇϴ ǥÁØ I/O ¶óÀ̺귯¸®ÀÌ´Ù. fopen ·çƾÀº filename ¿¡ ÀÇÇØ ½Äº°µÇ´Â È­ÀÏÀ» °³¹æÇϰí, ÇϳªÀÇ filename °ú °ü·ÃµÇ°Ô ÇÑ´Ù. ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é fopen Àº °³¹æ½ºÆ®¸²À» ½Äº°Çϱâ À§ÇÑ FILE ±¸Á¶¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. fclose ´Â È­Àϰú stream ¿¡ ÀÇÇØ ½Äº° µÈ ½ºÆ®¸²À» ´Ý°í, ½ºÆ®¸²ÀÌ Ãâ·Â ½ºÆ®¸²ÀÌ¸é ±× ½ºÆ®¸²ÀÇ ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â ¸ð µç ÀڷḦ Ãâ·ÂÇÑ´Ù. fopen ÀÇ µÎ¹øÂ° Àμö´Â Á¢±ÙÀÇ ¸ðµå¸¦ °áÁ¤ÇÏ´Â ¹®ÀÚ¿­ ÀÌ´Ù. À̰ÍÀº ´ÙÀ½ÀÇ ±âº»ÀûÀÎ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. r fopen Àº Àбâ Àü¿ëÀ¸·Î °³¹æÇÑ´Ù.(¸¸¾à È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é fopen È£ÃâÀº ½ÇÆÐÇϰí NULL À» µ¹·ÁÁØ´Ù.) w filename À» »ý¼ºÇϰųª Àý´Ü(truncate)Çϰí, ¾²±â Àü¿ëÀ¸·Î °³¹æÇÑ´Ù. a Àбâ Àü¿ëÀ¸·Î filename À» °³¹æÇÏ°í ¾²¿©Áö´Â ¸ðµç ÀÚ·á´Â ÀÚµ¿ÀûÀ¸·Î ±× È­ÀÏÀÇ ³¡¿¡ ÷°¡µÈ´Ù. È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é ¾²±â¸¦ À§ÇØ È­ÀÏÀ» »ý¼ºÇÑ´Ù. ÇϳªÀÇ È­ÀÏÀº °»½ÅÀ» À§ÇØ °³¹æµÉ ¼öµµ ÀÖ´Ù. À̰ÍÀº ±× È­ÀÏ¿¡ ¾²±â¿Í ¸ðµÎ ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. °»½Å¸ðµå´Â open ¿¡ Àü´ÞµÇ´Â type ¸Å°³ º¯¼ö¿¡ Ãß°¡ÀûÀÎ '+' ±âÈ£¸¦ »ç¿ëÇÏ¿© ³ªÅ¸³»¾îÁø´Ù. r+ °»½ÅÀ» À§ÇØ filename À» °³¹æÇÑ´Ù. ±× È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é fopen Àº ½ÇÆÐÇÑ´Ù. w+ filename À» »ý¼º ¶Ç´Â Àý´ÜÇÑ´Ù. ±×¸®°í ±× È­ÀÏÀ» °»½ÅÀ» À§ÇØ °³¹æÇÑ ´Ù. a+ °»½ÅÀ» À§ÇØ °³¹æÇÑ´Ù. ÀÚ·á´Â È­ÀÏÀÇ ³¡¿¡ ÷°¡µÈ´Ù. ÈÀÏÀ Á¸ÀçÇÏÁö ¾Ê À¸¸é È­ÀÏÀº ¾²±â¸¦ À§ÇØ »ý¼ºµÈ´Ù. 9.4. ´ÜÀϹ®ÀÚ I/O : getc ¿Í putc #include FILE *inf, *outf; int c; . . c = getc(inf); putc(c, outf); Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÇÇØ Á¦°øµÇ´Â °¡Àå °£´ÜÇÑ ÀԷ°ú Ãâ·Â ·çƾÀº getc ¿Í putc ÀÌ´Ù. getc ·çƾÀº ÀÔ·Â ½ºÆ®¸² inf ·Î ºÎÅÍ ´ÙÀ½ ¹®ÀÚ(Á»´õ Àû´çÇÏ°Ô ¸»ÇÏ¸é ´ÙÀ½ ¹ÙÀÌÆ®)¸¦ µ¹·ÁÁØ´Ù. putc ´Â outf ½ºÆ®¸²¿¡ ÇϳªÀÇ ¹®ÀÚ¸¦ Ãâ·Â ÇÑ´Ù. 9.5. ½ºÆ®¸²¿¡ ¹®ÀÚµéÀ» µÇµ¹¸®±â : ungetc #include FILE *stream; int c, retval; . . retval = ungetc(c, stream); ungetc ´Â ÀÔ·Â ½ºÆ®¸²¿¡ ¹®ÀÚ c ¸¦ µÇµ¹·Á ÁØ´Ù. À̰ÍÀº ³í¸®ÀûÀÎ ¿¬»êÀ̰í ÀÔ·ÂÈ­ÀÏ ÀÚü ´Â º¯°æµÇÁö ¾Ê´Â´Ù. Çѹø¿¡ ¿ÀÁ÷ ÇϳªÀÇ ¹®ÀÚ ¸¸À» µÇµ¹¸± ¼ö ÀÖ´Ù. 9.6. Ç¥ÁØ ÀÔ·Â, Ç¥ÁØ Ãâ·Â °ú Ç¥ÁØ ¿À·ù Ç¥ÁØ I/O ¶óÀ̺귯¸®´Â Ç¥ÁØ ÀÔ·Â, Ç¥ÁØ Ãâ·Â°ú Ç¥ÁØ ¿À·ù¿¡ ¿¬°áµÈ ¼¼°¡Áö ½ºÆ®¸²À» Á¦°øÇÑ´Ù. ÀÌ·¯ÇÑ Ç¥ÁØ ½ºÆ®¸²µéÀº °³¹æµÉ Çʿ䰡 ¾ø´Ù. ´ÙÀ½ÀÇ FILE Æ÷ÀÎÅÍ¿¡ ÀÇÇØ ½Äº°µÈ´Ù. stdin Ç¥ÁØÀÔ·ÂÀÇ FILE Æ÷ÀÎÅÍ stdout Ç¥ÁØÃâ·ÂÀÇ FILE Æ÷ÀÎÅÍ stderr Ç¥ÁØ¿À·ùÀÇ FILE Æ÷ÀÎÅÍ ´ÙÀ½ ¹®ÀåÀº stdin ¿¡¼­ ´ÙÀ½ ¹®ÀÚ¸¦ °¡Á®¿Â´Ù. inchar = getc(stdin); stdin °ú stdout Àº ¾ÆÁÖ ÀÚÁÖ »ç¿ëµÇ±â ¶§¹®¿¡ getc ¿Í putc ÀÇ Ãà¾àÇüÀÎ getchar ¿Í putchar ÀÌ Á¦°øµÈ´Ù. getchar ´Â stdin À¸·Î ºÎÅÍ ´ÙÀ½ ¹®ÀÚ¸¦ ÀÐ ¾î¿À°í putchar ´Â stdout À¸·Î ÇϳªÀÇ ¹®ÀÚ¸¦ º¸³½´Ù. ÇÔ¼ö getchar ¿Í putchar ´Â ¸Å°³ º¯¼ö·Î¼­ FILE Æ÷ÀÎÅ͸¦ °®Áö ¾Ê´Â´Ù. 9.7. Ç¥ÁØ I/O »óÅ ·çƾ ½ºÆ®¸²À¸ »óŸ¦ ¾Ë¾Æº¸±â À§ÇÑ ·çƾÀÌ ¸î°¡Áö ÀÖ´Ù. #include int retval, fd; FILE *stream; . . retval = ferror(stream); retval = feof(stream); clearerr(stream); fd = fileno(steam); ferror ´Â ÀÌÀüÀÇ ÀÔ·Â ¶Ç´Â Ãâ·Â ¿ä±¸ ¶§¹®¿¡ ½ºÆ®¸²¿¡ ¿À·ù°¡ ¹ß»ýÇß´Ù¸é 0 ÀÌ ¾Æ´Ñ °ªÀ» µ¹·ÁÁÖ´Â ºÎ¿ï(boolean)ÇÔ¼öÀÌ´Ù. 9.8. ¶óÀÎ ´ÜÀ§ ÀԷ°ú Ãâ·Â ÀڷḦ ¶óÀÎ ´ÜÀ§·Î ÀÔ·ÂÇϰí Ãâ·ÂÇϱâ À§ÇÑ ·çƾµéÀº ´ÜÀϹ®ÀÚ I/O ·çƾµé°ú ¹ÐÁ¢ÇÏ°Ô ¿¬°ü µÇ¾î ÀÖ´Ù. ±âº»ÀûÀÎ ¶óÀÎ ÀÔ·Â ·çƾÀº gets ¿Í fgets ÀÌ´Ù. #include char *buf, *retstring; FILE *inf; int nsize; . . retstring = gets(buf); retstring = fgets(buf, nsize, inf); gets ´Â Ç¥ÁØ ÀÔ·Â ½ºÆ®¸² stdin À¸·Î ºÎÅÍ ÀÏ·ÃÀÇ ¹®ÀÚµéÀ» ÀÐ°í °¢ ¹®ÀÚ¸¦ buf °¡ °¡¸®Å°´Â ¹öÆÛ¿¡ ÀúÀåÇÑ´Ù. ¹®ÀÚµéÀº È­ÀÏÀÇ ³¡ ¶Ç´Â newline À» ¸¸³¯ ¶§±îÁö ÀÐÇôÁö°í, newline Àº ¹«½ÃµÇ¸ç ½ºÆ®¸µÀ» Çü¼ºÇϱâÀ§ÇØ ³Î ¹®ÀÚ¸¦ buf ¿¡ ³Ö´Â´Ù. ¿À·ù°¡ ¹ß»ýÇϰųª È­ÀÏÀÇ ³¡¿¡ µµ´ÞÇÏ°í ¾Æ¹«·± ¹®ÀÚµµ ÀÐÇôÁöÁö ¾ÊÀ¸¸é, NULL ÀÌ µ¹¾Æ¿Â´Ù. fgets ´Â gets ÀÇ ÀϹÝÈ­µÈ ÇüÅÂÀÌ´Ù. gets ¿Í fgets ¿¡ ¹Ý´ëµÇ´Â ·çƾµéÀº °¢°¢ puts ¿Í fputs ÀÌ´Ù. #include char *string; FILE *outf; int retval; . . retval = puts(string); retval = fputs(string, outf); puts ´Â ³Î ¹®ÀÚ¸¦ Á¦¿ÜÇϰí Ç¥ÁØ Ãâ·Â ½ºÆ®¸²À¸·Î string ¿¡ ÀÖ´Â ¹®ÀÚµéÀ» Ãâ·ÂÇÑ´Ù. fputs ´Â outf °¡ ³ªÅ¸³»´Â Ãâ·Â ½ºÆ®¸²¿¡ string À» Ãâ·ÂÇÑ´Ù. ½Ã ½ºÅÛÀÇ ¿À·¡µÈ ¹öÀü°úÀÇ È£È¯¼ºÀ» º¸ÀåÇϱâ À§ÇØ puts ´Â fputs ¿Í´Â ´Ù¸£°Ô °³Çà ¹®ÀÚ¸¦ ÷°¡ÇÑ´Ù. ¿À·ùÀÇ °æ¿ì µÎ ÇÔ¼ö´Â EOF ¸¦ µ¹·ÁÁØ´Ù. 9.9. ÀÌÁø ÀԷ°ú Ãâ·Â : fread ¿Í fwrite #include char *buffer; int size, nitems, result; FILE *inf, *outf; . . result = fread(buffer, size, nitems, inf); result = fwrite(buffer, size, nitems, outf ); ÀÌÁø ÀԷ°ú Ãâ·ÂÀ» À§ÇØ ¾ÆÁÖ À¯¿ëÇÑ µÎ°³ÀÇ ·çƾÀÌ Á¦°øµÈ´Ù. fread ´Â inf ¿¡ ÇØ´çÇÏ´Â ÀÔ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ nitems °³ÀÇ ÀڷḦ ÀÐ¾î µéÀδÙ. ÀÐÇôÁö´Â ¹ÙÀÌÆ®µéÀº ¹®ÀÚÇü ¹è¿­ buffer ¿¡ ³õ¿©Áø´Ù. ÀÐÇôÁø °¢ À·á´ ±æÀ̰¡ size ÀÎ ¹ÙÀÌÆ® ¿­·Î¼­ ³ªÅ¸³»¾îÁø´Ù. º¹±Í°ª resul ´Â ¼º°øÀûÀ¸·Î ÀÐÇôÁø ÀÚ·áÀÇ °¹¼ö ¸¦ ³ªÅ¸³½´Ù. fwrite ´Â fread ÀÇ ¹Ý´ëÀÌ´Ù. 9.10. ¹«ÀÛÀ§È­ÀÏ Á¢±Ù : fseek, rewind, ftell Ç¥ÁØ I/O ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¡¸Ó°¡ ½ºÆ®¸²ÀÇ È­ÀÏ Æ÷ÀÎÅÍ À§Ä¡¸¦ ÀçÁ¶Á¤ÇÏ °Å³ª È­ÀÏ Æ÷ÀÎÅÍ ÀÇ ÇöÀç À§Ä¡¸¦ ãÀ» ¼ö ÀÖµµ·Ï ÇÏ´Â ¹«ÀÛÀ§ Á¢±Ù ·çƾÀ» Á¦ °øÇÑ´Ù. ÀÌ·¯ÇÑ ·çƾµéÀº fseek, rewind ¿Í ftell ÀÌ´Ù. #include FILE *stream; long offset, position; int direction, result; . . result = fseek(stream, offset, direction); rewind(stream); position = ftell(stream); fseek Àº ÇÏÀ§ ¼öÁØÀÇ lseek °ú À¯»çÇÏ°í ½ºÆ®¸²°ú °ü·ÃµÈ È­ÀÏÀÇ È­ÀÏ Æ÷ÀÎ ÅÍÀÇ À§Ä¡¸¦ ÁöÁ¤ ÇÑ´Ù. ±×·¯¹Ç·Î fseek Àº ´ÙÀ½ÀÇ ÀÔ·Â ¶Ç´Â Ãâ·ÂÀÇ À§Ä¡¸¦ ´Ù½Ã Á¤ÀÇÇÑ´Ù. direction ¸Å°³º¯¼ö´Â È­ÀÏ¿¡¼­ »õ·Î¿î À§Ä¡°¡ ¾îµð¿¡¼­ºÎÅÍ °è»êµÇ´Â°¡¸¦ °áÁ¤ÇÑ´Ù. direction ÀÌ 0 À¸·Î ÁÖ¾îÁö¸é È­ÀÏÀÇ Ã³À½¿¡¼­ ºÎÅÍ »õ·Î¿î À§Ä¡¸¦ °è»êÇϰí, ±× °ªÀÌ 1 À̸é ÇöÀçÀÇ À§Ä¡°¡ »ç¿ëµÇ¸ç, °ªÀÌ 2 ·Î ÁÖ¾îÁö¸é È­ÀÏÀÇ ³¡¿¡¼­ ºÎÅÍ »õ·Î¿î À§Ä¡¸¦ °è»êÇÑ´Ù. offset ¸Å°³º¯¼ö´Â ÀÌ ½ÃÀÛ À§Ä¡¿¡ ´õÇØÁú ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ ³ªÅ¸³½´Ù.rewind(stream) Àº fseek(stream, 0, 0) ÀÇ Ãà¾àÇüÀÌ´Ù. Áï, rewind ´Â Àбâ-¾²±â Æ÷ÀÎÅ͸¦ È­ÀÏÀÇ Ã³À½À¸·Î Áö Á¤ÇÑ´Ù. rewind ´Â ¾Æ¹«·± °ªµµ µ¹·ÁÁÖÁö ¾Ê´Â´Ù(½ÇÁ¦·Î, rewind ´Â void ÇÔ¼ö ·Î Á¤ÀǵȴÙ). ftell Àº ½ºÆ®¸²¿¡¼­ ÇÁ·Î±×·¥ÀÇ ÇöÀç À§Ä¡¸¦ µ·ÁÁØ´. ÇöÀçÀÇ À§Ä¡´Â È­ÀÏÀÇ Ã³À½ºÎÅÍ (0 ¿¡¼­ ºÎÅÍ °è»ê)ÀÇ ¹ÙÀÌÆ® ¼ö·Î ÁÖ¾îÁø´Ù. 9.11. Çü½ÄÈ­µÈ Ãâ·Â : printf #include char *fmt, *string; FILE *outf; int retval; /*NB parameters arg1 .. have arbitrary type */ . . retval = printf(fmt, arg1, arg2 ... argn); retval = fprintf(outf, fmt, arg1, arg2 .. argn); retval = sprintf(string, fmt, arg1, arg2 . argn); ÀÌ ·çƾµéÀº °¢°¢ Ãâ·Â ¹®ÀÚ¿­À» »ý¼ºÇϱâ À§ÇØ ÀÓÀÇÀÇ À¯ÇüÀÇ °¡º¯ÀûÀÎ °¹¼ö ÀÇ ¸Å°³º¯¼ö(arg1, arg2 µî)¿Í Çü½Ä ÁöÁ¤ ¹®ÀÚ¿­ fmt ¸¦ ¸Å°³º¯¼ö·Î °®´Â´Ù. ÀÌ Ãâ·Â ¹®ÀÚ¿­Àº fmt ¿¡ ÁöÁ¤µÈ Çü½ÄÀ» ÀÌ¿ëÇÏ ¿© ¸Å°³º¯¼ö arg1 ºÎÅÍ argn ±îÁöÀÇ Á¤º¸¸¦ Ç¥ÇöÇÑ´Ù. Á¤¼öÇü º¯È¯(integer conversion) %d ºÎÈ£°¡ ÀÖ´Â Á¤¼ö¸¦ À§ÇÑ Ç¥Áغ¯È¯ÄÚµåÀÌ´Ù. Á¤¼ö°¡ À½¼öÀÌ¸é ºÎÈ£°¡ ÀÚ µ¿ÀûÀ¸·Î ÷°¡µÈ´Ù. %u ¸Å°³º¯¼ö´Â ½ÊÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â ºÎÈ£¾ø´Â Á¤¼öÀÌ´Ù. %o ¸Å°³º¯¼ö´Â ºÎÈ£¾ø´Â ÆÈÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â Á¤¼öÀÌ´Ù. %x ¸Å°³º¯¼ö´Â ºÎÈ£¾ø´Â ½ÊÀ°Áø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â Á¤¼öÀÌ´Ù. ¹®ÀÚ a, b, c, d, e, f °¡ ºÎ°¡ÀûÀÎ ½ÊÀ°Áø¼ö ¼ýÀÚ¸¦ ³ªÅ¸³»±â À§ÇØ »ç¿ëµÈ´Ù. º¯È¯ ¸í¼¼°¡ %X ·Î ÁÖ¾îÁö¸é A, B, C, D, E, F °¡ »ç¿ëµÈ´Ù. %ld ¸Å°³º¯¼ö´Â ºÎÈ£ÀÖ´Â long Á¤¼öÀÌ°í ½ÊÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÈ´Ù. ÇÁ·Î±× ·¡¸Ó´Â %lo, %lu, %lx ¿Í %lX À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ºÎµ¿ ¼Ò¼ýÁ¡ º¯È¯(floating-point conversion) %f ¸Å°³º¯¼ö´Â ½ÊÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â float ¶Ç´Â double ÇüÀÌ´Ù. %e ¸Å°³º¯¼ö´Â Áö¼öÇü½ÄÀ¸·Î Ãâ·ÂµÇ´Â float ¶Ç´Â double ÇüÀÌ´Ù. À̰ÍÀº °ú ÇÐ ÀÀ¿ë¿¡ Àß »ç¿ëµÈ´Ù. %g À̰ÍÀº %e ¿Í %f ÀÇ È¥ÇÕÀÌ´Ù. À̰ÍÀº ÇØ´çÇÏ´Â ¸Å°³º¯¼ö°¡ float, double Áß Çϳª¶ó´Â °ÍÀ» ³ªÅ¸³½´Ù. ¹®ÀÚ¿­°ú ¹®ÀÚÁ¦¾î %c ¸Å°³º¯¼ö´Â ¹®ÀÚ ±×´ë·Î Ãâ·ÂµÇ´Â char Çü ÀÌ´Ù. ¹®ÀÚ¿¡ ÀúÀåµÈ ¼ýÀÚ°ªÀº Á¤¼ö º¯È¯Äڵ带 »ç¿ëÇÏ¿© Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. %s ÇØ´çÇÏ´Â ¸Å°³º¯¼ö´Â ¹®ÀÚ¿­(Áï, ¹®ÀÚÇü Æ÷ÀÎÅÍ)·Î¼­ Ãë±ÞµÈ´Ù. ÀÌ ¹®ÀÚ ¿­ ³»¿ëÀÌ Ãâ·Â ½ºÆ®¸²À¸·Î Àü´ÞµÈ´Ù. ¹°·Ð, ¹®ÀÚ¿­Àº ³Î ¹®ÀÚ·Î ³¡³ª¾ß ÇÑ´Ù. ±æÀÌ¿Í Á¤µµ(precision)ÀÇ ¸í½Ã º¯È¯ ¸í¼¼´Â ¸Å°³º¯¼ö°¡ Ãâ·ÂµÇ´Â ÇʵåÀÇ ÃÖ¼Ò ¹®ÀÚ ±æÀÌ¿¡ °üÇÑ Á¤º¸¿Í ±× Çʵå´Â Á¤È®µµ¿¡ ´ëÇÑ Á¤º¸¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. Á¤¼öÇü ¸Å°³º¯¼ö ÀÇ °æ¿ìÁ¤µµ´Â ÃÖ¼Ò °¹¼öÀÇ ¼ýÀÚ¸¦ ³ªÅ¸³»°í, float ¶Ç´Â double ¸Å°³º¯¼ö¿¡¼­´Â ¼Ò¼öÁ¡ ´ÙÀ½ ¿¡ ³ªÅ¸³¯ ¼ýÀÚÀÇ °¹¼ö¸¦ ³ªÅ¸³½´Ù. ¹®ÀÚ¿­ ¸Å°³º¯¼ö¿¡¼­´Â ±× ¹®ÀÚ¿­¿¡¼­ Ãë ÇÒ ¼ö ÀÖ´Â ¹®ÀÚµéÀÇ ÃÖ´ë °¹¼ö¸¦ ³ªÅ¸³½´Ù. %10.5d ´Â ÇØ´ç Á¤¼ö ¸Å°³º¯¼ö¸¦ 10 ¹®ÀÚ ±æÀÌ·Î Ãâ·Â ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. %.5f ´Â ÇØ´çÇÏ´Â float ¶Ç´Â double ¸Å°³º¯¼ö¸¦ 5 ÀÚ¸® ¼Ò¼öÁ¡À¸·Î Ãâ·ÂÇÑ´Ù. %10s ´Â ±æÀ̰¡ ÃÖ¼Ò 10 ¹®ÀÚÀÎ Çʵå·Î ÇØ´ç ¹®Àå¿­À» Ãâ·ÂÇÑ´Ù. %-30s ´Â ÇØ´ç ¹®ÀÚ¿­ ¸Å°³º¯¼ö°¡ 30 ¹®ÀÚÀÇ Çʵ忡¼­ ¿ÞÂʺÎÅÍ Ãâ·ÂµÇ´Â °ÍÀ» ³ª Ÿ³½´Ù. Ư¼öºÎÈ£ Ãâ·Â º¯È¯ ¸í¼¼´Â Ãß°¡ÀûÀÎ ºÎÈ£¿¡ ÀÇÇØ ´õ¿í º¹ÀâÇØ Áú¼ö ÀÖ´Ù. # (hash ¶Ç ´Â sharp)ÀÌ ±× ¿¹ÀÌ´Ù. À̰ÍÀº ¸í¼¼ÀÇ ±æÀÌ ºÎºÐ ¹Ù·Î ¾Õ¿¡ ³ªÅ¸³ª¾ß ÇÑ´Ù. int arg; arg = 0xFF; printf("In octal, %#o\n", arg); ´Â ´ÙÀ½À» Ãâ·ÂÇÑ´Ù. In octal, 0377 + ºÎÈ£´Â ¼ýÀÚ°¡ ¾ç¼öÀÏ ¶§ + ºÎÈ£°¡ Ãâ·ÂµÇµµ·Ï ÇÑ´Ù. float farg; farg = 57.88; printf("Value of farg is %-+10.f\n"); Àº Value of farg is +57.88 À» Ãâ·ÂÇÑ´Ù. sprintf ·çƾ sprintf À» Ãâ·Â ·çƾÀ¸·Î »ý°¢ÇÏÁö ¸¶¶ó. sprintf ´Â °¡Àå ½ÅÃ༺ ÀÖ´Â ¹® ÀÚ¿­ Á¶ÀÛ°ú C ¶óÀ̺귯¸®¿¡¼­ ÀϹÝÀûÀÎ º¯È¯ ´É·ÂÀ» Á¦°øÇÑ´Ù. /*genkey -- generate key for use in data- base */ /* key will always be 20 chars long */ #include char *genkey(buf, suppcode, orderno) char *buf; /*will hold generated key*/ char *suppcode; /*supplier code*/ long orderno; /*order number*/ { /*is suppcode valid?*/ if(strlen(suppcode) != 10) return (NULL); sprintf(buf, "%s_%.9ld", suppcode, orderno); return(buf); } genkey ÀÇ ´ÙÀ½ È£ÃâÀº printf("%s\n", genkey(buf, "abcedfghij", 12)); ´ÙÀ½ ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù. abcedfghij_000000012 9.12. Çü½ÄÈ­µÈ ÀÔ·Â : scanf #include char *fmt, *string; FILE *inf; int retval; /*NB: ptr1... ptrn are all pointers. *The type of the variable they point *to is arbitrary. */ . . retval = scanf(fmt, ptr1, ptr2, .. ptrn); retval = fscanf(inf, fmt, ptr1, ptr2 .. ptrn); retval = sscanf(string, fmt, ptr1, ptr2 .. ptrn); ÀÌµé ·çÆ¾µéÀº printf ÀÇ ·çƾµé°ú´Â ¹Ý´ëµÇ´Â °ÍÀÌ´Ù. À̵éÀº ¸ðµÎ ½ºÆ®¸²À¸ ·ÎºÎÅÍ ÀÔ·Â(sscanf ÀÇ °æ¿ì´Â ¹®ÀÚ¿­)À» ¹Þ¾Æ ¹®ÀÚ¾ó fmt ÀÇ Çü½Ä ÁöÁ¤¿¡ µû ¶ó ÀÔ·ÂÀ» ÇØµ¶ÇÏ°í °á°ú·Î ¾ò¾îÁø ÀڷḦ Æ÷ÀÎÅÍ ptr1, ..., ptrn ÀÌ ³ªÅ¸³» ´Â º¯¼ö¿¡ ÁöÁ¤ÇÑ´Ù. ½ºÆ®¸²¿¡ ´ëÇÑ È­ÀÏ Æ÷ÀÎÅʹ ó¸®µÈ ¹®ÀÚÀÇ °¹¼ö¸¸ ÀüÁø ÇÑ´Ù. ÀϹÝÀûÀ¸·Î scanf Çü½ÄÁöÁ¤ ¹®ÀÚ¿­Àº ´ÙÀ½À» Æ÷ÇÔÇÑ´Ù. 1. °ø¹é¹®ÀÚ(white-space character) : °ø¹é, ÅÇ, °³Ç๮ÀÚ, form feed 2. º¸ÅëÀÇ ºñ°ø¹é¹®ÀÚ : À̰ÍÀº ÀԷ½ºÆ®¸²ÀÇ ÇØ´ç¹®ÀÚ¿Í ±×´ë·Î ÀÏÄ¡µÈ´Ù. 3. º¯È¯¸í¼¼ : printf ¿¡ »ç¿ëµÇ´Â ¸í¼¼¿Í µ¿ÀÏÇÏ´Ù. /* demo program for scanf */ #include main() { int i1, i2; float flt; char str1[10], str2[10]; scanf("%2d%2d %f %s %s", &i1, &i2, &flt, str1, str2); . . } 9.13. Ç¥ÁØ I/O ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥ÀÇ ¼öÇà Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡´Â ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ ÇÁ·Î±×·¥À» ¼öÇàÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ ´Â ·çƾÀÌ ¸î°³ ÀÖ´Ù. À̵é Áß¿¡¼­ °¡Àå ±âÃÊÀûÀÎ °ÍÀº system ÀÌ´Ù. #include int retval; char *comstring; . . retval = system(comstring); ½Ã½ºÅÛÀº comstring ¿¡ ´ã°ÜÁø ¸í·É¾î¸¦ ¼öÇàÇÑ´Ù. À̸¦ À§Çؼ­ ¿ì¼± ÀÚ½Ä ÇÁ ·Î¼¼½º »ý¼ºÇÑ´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º´Â ´Ù½Ã exec ¸¦ È£ÃâÇÏ¿© Ç¥ÁØ UNIX ½© (/bin/sh)À» ¼öÇàÇϰí comstring À» ÀÔ·ÂÀ¸·Î ÁØ´Ù. (SVID ¿¡¼­ ½ÇÁ¦·Î ¾ð±ÞÇÑ °ÍÀº ¸í·É¾î ÇØ¼®±âÀÌÁö¸¸ À̵µ ¿ª½Ã UNIX ½©°ú À¯»çÇÏ°Ô ÇØµ¿ÇØ¾ß ÇÑ´Ù.) system ·çƾ¿¡¼­ ºÎ¸ð ÇÁ·Î¼¼¼­ wait ¸¦ È£ÃâÇÔÀ¸·Î½á ÁÖ¾îÁø ¸í·É¾îÀÇ ¼öÇàÀÌ ¿Ï·áµÈ ´ÙÀ½¿¡ ¼öÇàÀ» Àç°³Çϵµ·Ï ÇÑ´Ù. °á°úÀûÀ¸·Î µ¹¾Æ¿À´Â °ª retval Àº ½© ÀÇ Á¾·á»óÅ·μ­, ÀÌ °ª¿¡ ÀÇÇØ ÁÖ¾îÁø ¸í·É¾î°¡ ¼º°øÇß´ÂÁö ½ÇÆÐÇß´Â Áö¸¦ ¾Ë ¾Æ³¾¼ö ÀÖ´Ù. ¸¸¾à fork ³ª exec È£ÃâÀÌ ½ÇÆÐÇϸé retval ÀÇ °ªÀº -1 ÀÌ µÈ´Ù. system ¿¡´Â Ä¿´Ù¶õ °áÁ¡ÀÌ ÀÖ´Ù. ÇÁ·Î±×·¥Àº ÀÚ½ÅÀÌ ¼öÇàÇÑ ¸í·É¾î·Î ºÎÅÍÀÇ Ãâ·Â¿¡ Á÷Á¢ Á¢±ÙÇÒ ±æÀÌ ¾ø´Ù. ÀÌÁ¢À» ÇØ°áÇÏ·Á¸é Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÖ ´Â popen °ú pclose ·çƾ À» »ç¿ëÇØ¾ß ÇÑ´Ù. #include FILE *strm, *popen(); char *comstring, *typestring; int retval; . . strm = popen(comstring, type); retval = pclose(strm); system ÀÇ °æ¿ì¿Í °°ÀÌ popen µµ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ¿© comstring ÀÌ °¡ ¸®Å°´Â ¸í·É¾î¸¦ ¼öÇà°Ô ÇÑ´Ù. ±×·¯³ª system °ú ´Ù¸¥ Á¡Àº È£ Ãâ ÇÁ·Î¼¼½º¿Í ¸í·É¾î »çÀÌ¿¡ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù. À̶§ ÆÄÀÌÇÁ¿¡ ½ºÆ®¸²ÀÌ ´ëÀÀµÇ°Ô µÇ°í, ÀÌ´Â strm ¿¡ ÁöÁ¤µÈ´Ù. À̶§ type ÀÇ °ªÀÌ "w" ¶ó¸é ÇÁ·Î±×·¥¿¡¼­ÀÇ Ãâ ·ÂÀÌ ½ºÆ®¸²À» ÅëÇØ ¸í·É¾îÀÇ Ç¥ÁØ ÀÔ·ÂÀ¸·Î Àü´ÞµÉ ¼ö ÀÖ´Ù. type ÀÌ "r" ÀÌ ¶ó¸é ¹Ý´ë·Î ¸í·É¾îÀÇ Ç¥ÁØ ÀÔ·ÂÀ» ÇÁ·Î±×·¥¿¡¼­ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ°Ô µÈ´Ù. popen À¸·Î °³¹æµÈ ½ºÆ®¸²Àº Ç×»ó pclose ·Î Æó¼âµÇ¾î¾ß ÇÑ´Ù. 9.14. ±âŸÀÇ È£Ãâ Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÖ´Â ±× ¹ÛÀÇ ÇÔ¼ö¸¦ »ìÆìº¸ÀÚ. 9.14.1. freopen °ú fdopen #include FILE *oldstream, *newstream; char *type, *filename; int filedes; . . newstream = freopen(filename, type, oldstre am); oldstream = fdopen(filedes, type); freopen Àº oldstream ÀÌ °¡¸®Å°´Â ½ºÆ®¸²À» Æó¼âÇϰí filename ¿¡¼­¿À´Â ÀÔ ·ÂÀ» À§ÇØ À̸¦ ´Ù½Ã °³¹æÇÑ´Ù. type Àº »õ·Î¿î ½ºÆ®¸²À» Á¢±ÙÇÏ´Â ¸ðµå¸¦ °á Á¤ÇÑ´Ù. µÎ ÇÔ¼ö ¸ðµÎ ¿À·ù°¡ ¹ß»ýÇϸé NULL À» µ¹·ÁÁØ´Ù. 9.14.2. ´Ü¾î ÀÔÃâ·Â : getw ¿Í putw #include int word, res; FILE *inf, *outf; . . word = getw(inf); res = putw(word, outf); ÀÌµé µÎ ·çƾÀº ´Ü¾î(word) ´ÜÀ§·Î ÀÔÃâ·ÂÀ» ¼öÇàÇÑ´Ù. ´Ü¾î¶õ C ÄÄÆÄÀÏ·¯°¡ Á¦°øÇÏ´Â Á¤¼ö ÇüÀÚ·á·Î¼­ ´Ü¾îÀÇ Å©±â, ±×¸®°í À̵é ÇÔ¼öÀÇ »ç¿ë¹ýÀº ÄÄÇ»ÅÍ ¸¶´Ù ´Ù¸£´Ù. getw ´Â inf °¡ °¡¸®Å°´Â ½ºÆ®¸²ÀÇ ´ÙÀ½¹ø ´Ü¾î (Áï ÀÌÁø Á¤¼ö) ¸¦ °¡Á®¿Â´Ù. putw ´Â outf °¡ °¡¸®Å°´Â ½ºÆ®¸²¿¡ ÇÑ ´Ü¾î¸¦ ½á ³Ö´Â´Ù. µÎ ÇÔ ¼ö ¸ðµÎ ¿À·ù ¹ß»ý½Ã¿¡´Â EOF ¸¦ µ¹·ÁÁØ´Ù. 9.14.3. ¹öÆÛÀÇ Á¦¾î : setbuf setvbuf #include FILE *stream; char buf1[BUFSIZ], buf2[SOMEVALUE]; int type, size, res; . . setbuf(stream, buf); res = setvbuf(stream, buf2, type, size); setbuf ´Â Ç¥ÁØ I/O ¶óÀ̺귯¸®°¡ º¸Åë¶§ ÇÒ´çÇÏ´Â ¹öÆÛ ´ë½Å buf1 À» »ç¿ë Çϵµ·Ï ÇØÁØ´Ù. buf1 ÀÇ Å©±â´Â stdio.h ¿¡ Á¤ÀÇµÈ »ó¼ö BUFSIZ °¡ °áÁ¤ÇÑ´Ù. setbuf ÀÇ Àμö·Î ¹®ÀÚÇü Æ÷ÀÎ NULL À» Àü´ÞÇϸé ÀÔÃâ·ÂÀº ¹öÆÛ¿¡ ´ã±âÁö ¾Ê´Â ´Ù. ÀÌ ±â´ÉÀº ºñÁ¤»óÀûÀ¸·Î Á¾·áÇÏ´Â ÇÁ·Î±×·¥¿¡¼­ ¹öÆÛ¿¡ ÀÖ´Â ÀڷḦ ÀÒ¾î ¹ö¸± ¿ì·Á°¡ ÀÖÀ» ¶§, À̸¦ µð¹ö±ëÇϱâ À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. setvbuf ´Â Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ »õ·Î ÷°¡µÈ ÇÔ¼ö·Î¼­ setbuf º¸´Ù ´õ Á¤¹ÐÇÑ Á¦¾î¸¦ °¡´ÉÇÏ °Ô ÇÑ´Ù. type Àμö´Â stream ÀÌ ¹öÆÛ¸µµÇ´Â ¹æ¹ýÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â °ªÀº stdio.h ¿¡ ´ÙÀ½°ú °°ÀÌ ¼¼°¡Áö·Î Á¤ÀǵǾî ÀÖ´Ù. _IOFBF ½ºÆ®¸²Àº ¿ÏÀüÈ÷ ¹öÆÛ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ´Ü¸»±â¿¡ ¿¬°áµÇÁö ¾ÊÀº ¸ð µç ½ºÆ®¸²¿¡ ´ëÇÑ ±âº» °ªÀÌ´Ù. µû¶ó¼­ ÀڷḦ ÀÐ°í ¾µ¶§´Â È¿À²À» ±Ø´ëÈ­ Çϱâ À§ÇØ BUFSIZ °³ÀÇ ¹ÙÀÌÆ®¸¦ ´ÜÀ§·Î ÇÑ´Ù. _IOLBF Ãâ·ÂÀº ¶óÀÎ ´ÜÀ§·Î ¹öÆÛ¿¡ ´ã±â°í newline¹®ÀÚ°¡ ¾²ÀÏ ¶§¸¶´Ù ¹öÆÛ¸¦ ºñ¿ì °Ô µÈ´Ù. ¹öÆÛ¸¦ ºñ¿ï °æ¿ì´Â ÀÌ ¹Û¿¡µµ ¹öÆÛ°¡ ¸ðµÎ áÀ» ¶§³ª ÀÔ·ÂÀÌ ¿ä ±¸µÈ °æ¿ìÀÌ´Ù. ÀÌ´Â ´Ü¸»±â¸¦ À§ÇÑ ±âº»°ªÀÌ¸ç ´ëÈ­½Ä »ç¿ë¿¡ µµ¿òÀ» ÁÖ±â À§ÇØ °í¾ÈµÇ¾ú´Ù. _IOBNF À̶§´Â ÀÔÃâ·Â¿¡ ¹öÆÛ¸¦ »ç¿ëÇÏÁö ¾Ê°Ô µÈ´Ù. ÀÌ °æ¿ì buf2 ¿Í size ´Â ¹« ½ÃµÈ´Ù. ÀÌ ¸ðµå´Â ¿À·ù±â·Ï½Ã À¯¿ëÇÏ´Ù. type À̳ª size ¿¡ ºÎ´çÇÑ °ªÀÌ »ç¿ëµÇ¸é setv buf ´Â 0 ÀÌ ¾Æ´Ñ °ªÀ» µ¹·ÁÁÜ ¿¡ ÁÖÀÇÇ϶ó. ¿ªÀ¸·Î 0 ÀÌ µ¹¾Æ¿À¸é ¼º°øÀ» ÀǹÌÇÑ´Ù. ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 62¹ø Á¦ ¸ñ:[moohou] Unix System Programming 10 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:43 ÀÐÀ½:4149 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- _________________________________________________________________________ Unix System Programming 10 - ±è¼ºÈ£(moohou) _________________________________________________________________________ Á¦10Àå È­¸éÁ¶ÀÛ 10.1. ¼­·Ð CRT/VDU ´Ü¸»±âÀÇ È­¸éÀ» ´Ù·ç´Â µµ±¸µéÀ» ¼Ò°³ÇÑ´Ù. È­¸éÀ» ´Ù·ç´Â µµ±¸¿¡´Â ¹ÐÁ¢ÇÏ°Ô °ü·ÃµÈ µÎ°³ÀÇ C ¶óÀ̺귯¸®°¡ ÀÖ´Ù. 1. curses À̰ÍÀº Çϵå¿þ¾î¿¡ ÀÇÁ¸ÇÏÁö ¾Ê°í È­¸éÀ» Á¶ÀÛÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¶óÀ̺귯¸®´Â ´Ü¸»±âÀÇ Çϵå¿þ¾î¿¡ ¹«°üÇÑ ÀڷᱸÁ¶ÀÎ À©µµ¿ì(window)¸¦ Á¦°øÇÑ´Ù. curses¶ó´Â À̸§ ¿ª½Ã ÃÖÀûÈ­ Ä¿¼­ À̵¿ (cursor motion optimization )¿¡¼­ µû¿Â°ÍÀÌ´Ù. À̰ÍÀº AT&T ½Ã½ºÅÛ V ÀÎÅÍÆäÀ̽º Á¤ÀÇ (SVID) ÀÇ Issue 2 ¿¡ Á¤ÀǵǾî ÀÖ´Ù. 2. terminfo ÀÌ ¶óÀ̺귯¸®´Â curses ¿Í´Â ´Þ¸® Çϵå¿þ¾î¿Í ¹ÐÁ¢ÇÑ ¿¬°ü¼ºÀ» °¡Áø ·çƾÀ» Á¦°øÇÑ´Ù. terminfo ¿ª½Ã SVID ÀÇ Issue 2 ¿¡ Á¤ÀǵǾî ÀÖ´Ù. curses ¿Í terminfo µÑ´Ù, ÇöÀçÀÇ ¹öÀüÀº terminfo ¶ó´Â °¢°¢ÀÇ ´Ü¸»±âÀÇ Æ¯ ¼ºÀ» ±â·ÏÇØ µÎ´Â µ¥ÀÌŸº£À̽º(database)¸¦ »ç¿ëÇÑ´Ù. /usr/lib/terminfo// Àº ½ÇÁ¦ ´Ü¸»±âÀÇ À̸§ÀÌ°í ´Â ÀÇ Ã¹±ÛÀÚÀÌ´Ù. /usr/lib/terminfo/v/vt100 Àº ´Ü¸»±â vt100 ÀÇ Æ¯¼ºµéÀ» ±â·ÏÇØµÎ´Â È­ÀÏÀÌ´Ù. curses ¿Í terminfo ÀÇ ·çƾµéÀº ¸ÕÀú ȯ°æ º¯¼ö(environment variable) TERM À» º¸°í ´Ü¸»±âÀÇ À̸§ À» ¾Ë¾Æ³½ ´ÙÀ½, terminfo µ¥ÀÌŸº£À̽º¿¡¼­ ±× ´Ü¸»±â¿¡ ´ëÀÀÇÏ´Â È­ÀÏÀ» 㠴´Ù. termcap ¶óÀ̺귯¸® terminfo ´Â AT&T ¿¡¼­ »õ·ÎÀÌ ¸¸µé¾î ³½ °ÍÀÌ´Ù. ¾î¶² UNIX ½Ã½ºÅÛ¿¡¼­´Â terminfo ´ë½Å termcap À̳ª termlib °¡ ÀÖÀ» ¼öµµ ÀÖ´Ù. termcap Àº ´Ü¸»±â ¸í¼¼°¡ /etc/termcap À̶ó´Â È­ÀÏ¿¡ ±â·ÏµÇ¾îÀÖ´Ù. »õ·Î¿î ´Ü¸»±â¿¡ ´ëÇÑ ¸í¼¼ ¸¦ ¸¸µé·Á¸é ±× È­ÀÏÀ» »ç¿ëÀÚ°¡ ÆíÁý(edit)ÇÏ¸é µÈ´Ù. ¼ÒÇÁÆ®¿þ¾î °³¹ßÀ» ½± °ÔÇϱâ À§ÇØ terminfo ¶óÀ̺귯¸®´Â termcap ¶óÀ̺귯¸®º¸´Ù »óÀ§ÀÇ È£È¯¼ºÀ» °¡Áø´Ù. 10.2. curses ¶óÀ̺귯¸® : °³¿ä ÇÁ·Î±×·¡¸Ó´Â À©µµ¿ì¶ó´Â ÀڷᱸÁ¶¸¦ ÅëÇØ¼­ ¸ðµç ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù. À©µµ¿ì ÀÇ ÀÚ·áÇüÀº WINDOW Àε¥, À̰ÍÀº Ç¥ÁØ ÀÎÅ©·çµå È­ÀÏ(standard include file) ÀÎ curses.h ¿¡ Á¤Àǰ¡ µÇ¾îÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â newwin À̶ó´Â ·çƾÀ» »ç¿ëÇØ ¼­ »õ·Î¿î À©µµ¿ì¸¦ ¸¸µé ¼ö ÀÖ´Ù. ±×¸®°í Àü¿ª¿¡¼­ »ç¿ëÇÒ ¼ö Àִ ǥÁØ À©µµ ¿ì stdscr µµ ÀÖ´Ù. curses ¿¡ ´ëÇØ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇϱâ Àü¿¡ µÎ°¡Áö Á¡À» ¸ÕÀú ÁöÀûÇÏ°í ³Ñ¾î °¡·Á°í ÇÑ´Ù. 1. curses ÀÇ ·çƾµéÀÌ ÀÚµ¿ÀûÀ¸·Î ÇÁ·Î±×·¥°ú ¸µÅ©µÇ´Â °ÍÀº ¾Æ´Ï´Ù. µû¶ó¼­ ÄÄÆÄÀÏÇÒ ¶§, »ç¿ëÀÚ°¡ ¸µÅ©½ÃÄÑ¾ß ÇÑ´Ù. $cc -o scrnprog scrnprog.c -lcurses terminfo ¿¡ ´ëÇØ¼­µµ °°Àº ¹æ¹ýÀ¸·Î ¸µÅ©ÇÑ´Ù. 2. curses ´Â C ¾ð¾îÀÇ ¸ÅÅ©·Î(macro)¸¦ ÀÌ¿ëÇØ¼­ Á¤ÀǵǴ °ÍÀÌ ¸¹´Ù. µû¶ó ¼­ ÇÁ·Î±×·¡¸Ó´Â ±×°ÍµéÀ» »ç¿ëÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ±×¸®°í ÄÄÆÄÀϽà ¿¹ »óÄ¡ ¸øÇÑ ¿À·ù ¸Þ½ÃÁö¿¡ ´ëºñÇØ¾ß ÇÑ´Ù. 10.3. curses ÀÇ ÀϹÝÀûÀÎ ±¸Á¶ ¸ðµç curses ÇÁ·Î±×·¥Àº ±âº»ÀûÀÎ ±¸Á¶·Î ±¸¼ºµÈ´Ù. #include main() { initscr(); /* main body */ endwin(); exit(0); } curses.h ´Â curses ·çƾÀ» »ç¿ëÇÏ´Â ¸ðµç ÇÁ·Î±×·¥¿¡ Ç×»ó Æ÷ÇÔ(include) µÇ ¾î¾ß ÇÑ´Ù. ½Ã½ºÅÛ V ¿¡¼­´Â curses.h ¿¡ ÇìµåÈ­ÀÏ terminfo.h °¡ ÀÚµ¿ÀûÀ¸·Î Æ÷ÇԵȴÙ. curses.h ¿¡´Â curses ÀÇ ÀڷᱸÁ¶¿Í Áß¿äÇÑ ¸ÅÅ©·ÎµéÀÌ µé¾îÀÖ´Ù. initscr ·çƾÀº ¸ðµç curses ÇÔ¼ö¿¡ ¾Õ¼­¼­ ¼öÇà½ÃÄÑ¾ß ÇÑ´Ù. ÀÌ ·çƾÀº curses ÀÇ ÀڷᱸÁ¶¸¦ ÃʱâÈ­Çϰí UNIX ȯ°æÀÇ TERM º¯¼ö¸¦ ÅëÇÏ¿© ´Ü¸»±âÀÇ Á¾·ù¸¦ °áÁ¤ÇÑ´Ù. ±×·¸°Ô ÇÔÀ¸·Î¼­ ¿ø·¡ÀÇ ´Ü¸»±â »óÅ·Πµ¹¾Æ°¥ ¼ö ÀÖ°í Ä¿¼­ ´Â ¸Ç ¾Æ·¡ ¿ÞÂÊ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. #include main() { initscr(); refresh(); endwin(); } refresh ¶Ç´Â ´õ ÀϹÝÀûÀÎ ¹öÀüÀÎ wrefresh ¸¦ ¼öÇà½ÃÄѾ߸¸ À©µµ¿ìÀ¸ ³»¿ëÀÌ ½ÇÁ¦È­¸é (physical screen) ¿¡ ³ªÅ¸³ª°Ô µÈ´Ù. refresh ´Â Ç¥ÁØÀ©µµ¿ì stdscr ÀÇ ³»¿ëÀ» ½ÇÁ¦È­¸é¿¡ Ç¥½ÃÇϰí, wrefresh ´Â ƯÁ¤ À©µµ¿ìÀÇ ³»¿ëÀ» ½ÇÁ¦È­¸é ¿¡ Ç¥½ÃÇÑ´Ù. 10.4. ¸ðµå ÁöÁ¤ curses ·çƾÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡¼­´Â initscr À» ¼öÇà½ÃŲ ´ÙÀ½ ´Ü¸»±âÀÇ ÀÔÃâ·Â ¸ðµå¸¦ ÁöÁ¤ÇÑ´Ù. echo(); /* enable echoing */ noecho(); /* disable echoing */ ´Ü¸»±âÀÇ ¹ÝÇâ(echo) ±â´ÉÀ» ÀÛµ¿½ÃŰ°Å³ª Á¤Áö½Ãų ¼ö ÀÖ´Ù. µðÆúÆ® (default)·Î´Â ¹ÝÇâ ±â´ÉÀ» ÀÛµ¿½ÃŲ´Ù. nl(); /* enable CR-NL mappings */ monl(); /* disable mappings */ nl Àº Ãâ·Â½Ã °³Ç๮ÀÚ(newline) °¡ newline/ carriage-return À¸·Î ¹Ù²î¾î¼­ Ãâ·ÂµÇ°Å³ª, ÀԷ½à newline/carriage-return ÀÌ °³Ç๮ÀÚ·Î ¹Ù²î¾î¼­ ÀÔ·ÂµÈ ´Ù. default ´Â nl ÀÌ´Ù. cbreak(); /* enable CBREAK mode */ nocbreak(); /* disable CBREAK mode */ cbreak ´Â ÀԷ½Ã, ÀÎÅÍ·´Æ®(interrupt) ¿Í È帧 Á¦¾î Ű(flow control key) ¸¦ Á¦¿ÜÇϰí´Â ÀÔ·ÂÀÚ·á¿¡ ¾î¶°ÇÑ ÀÛ¿ëµµ °¡ÇÏÁö ¾Ê´Â´Ù. raw(); /* enable RAW mode */ noraw(); /* disable RAW mode */ raw ´Â ´Ü¸»±â¸¦ RAW ¸ðµå·Î ¸¸µç´Ù. ÀÌ ¸ðµå´Â CBREAK ¸ðµå¿Í ºñ½ÁÇѵ¥, ´Ù ¸¥°ÍÀº ½Åȣó¸®(signal processing)°ú ȸ§Á¦¾î¸¶Àúµ ÀÛµ¿ÁßÁö½ÃŲ »óŶó´Â Á¡ÀÌ´Ù. savetty(); /* save tty state */ resetty(); /* reset tty state */ ´Ü¸»±âÀÇ »óŸ¦ ÀúÀåÇϰųª º¹±¸½Ãų ¼ö ÀÖ´Ù. savetty ´Â ÇöÀç ´Ü¸»±â »óÅ ¸¦ curses ÀÇ ³»ºÎ¹öÆÛ¿¡ ÀúÀåÇØ ÁØ´Ù. restty ´Â ¹Ù·Î Àü¿¡ savetty ·Î ÀúÀå ÇØµÐ »óŸ¦ º¹±¸½ÃŲ´Ù. 10.5. ¹®ÀÚ¿Í ¹®ÀÚ¿­ ¾²±â curses ´Â À©µµ¿ì stdscr ¿¡ ¹®ÀÚ¿Í ¹®ÀÚ¿­À» ¾²´Â 4 °³ÀÇ ·çƾÀ» Á¦°øÇÑ´Ù. addch, mvaddch, addstr, mvaddstr ÀÌ´Ù. #include int c, y, x; char *string; . . addch(c); mvaddch(y, x, c); addstr(string); mvaddstr(y, x, string); addch ·çƾÀº stdscr »óÀÇ ÇöÀç Ä¿¼­ À§Ä¡¿¡ ¹®ÀÚ c ¸¦ ¾´´Ù. refresh ¸¦ ÇØ ÁÖ¾î¾ß¸¸ ½ÇÁ¦ È­¸é¿¡ ³ªÅ¸³­´Ù. CTRL-C ´Â ^C ó·³ ¾²ÀδÙ. mvaddch ·çƾÀº Ä¿¼­¸¦ ¼¼·Î·Î y ¹øÂ° ÁÙ, °¡·Î·Î x ¹øÂ° ¿­·Î ¿òÁ÷ÀÎ ÈÄ¿¡ ±ÛÀÚ¸¦ ¾´´Ù. ¸Ç À­ÁÙ ¿ÞÂÊÀÌ ÁÂÇ¥(0,0)ÀÌ´Ù. addstr °ú mvaddstr Àº 0 À¸·Î ³¡³ª´Â ¹®ÀÚ¿­ string À» À©µµ¿ì stdscr ¿¡ ¾´´Ù. 10.6. Çü½ÄÈ­µÈ Ãâ·Â curses ¿¡´Â C ¾ð¾îÀÇ printf ¿Í ºñ½ÁÇÑ ±â´ÉÀ» Á¦°øÇÏ´Â ·çƾµéÀÌ ÀÖ´Ù. Ç¥ ÁØ À©µµ¿ì stdscr ¿¡ ¾²ÀÌ´Â ·çƾµé·Î´Â printw ¿Í mvprintw °¡ ÀÖ´Ù. #include char *fmt; int y, x; /* NB arg0, arg1 ... argn have arbitrary type */ . . printw(fmt, arg0, arg1, ... argn); mvprintw(y, x, fmt, arg0, arg1, ... argn); 10.7. Ä¿¼­ À̵¿ move ¸í·ÉÀ» »ç¿ëÇÏ¿© Ç¥ÁØ À©µµ¿ì stdscr À§¿¡¼­ Ä¿¼­¸¦ ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù. #include int y, x; . . move(y, x); ¸Å°³º¯¼ö y ¿Í x ¸¦ »ç¿ëÇÏ¿© »õ·Î¿î ÁÂÇ¥¿¡ Ä¿¼­¸¦ À§Ä¡½Ãų ¼ö ÀÖ´Ù. refresh °¡ ¼öÇàµÇ¾î¾ß¸¸ ½ÇÁ¦ Ä¿¼­ À§Ä¡°¡ ¹Ù²ï´Ù. getyx ·çƾÀ» »ç¿ëÇÏ¿© Ä¿¼­ÀÇ ÇöÀç À§Ä¡¸¦ ¾Ë¼ö ÀÖ´Ù. #include int y, x; WINDOW *w; . . getyx ´Â WINDOW ¿¡ ´ëÇÑ Æ÷ÀÎÅͰ¡ ù¹øÂ° º¯¼ö·Î ÁÖ¾îÁ®¾ß ÇÑ´Ù. ù¹øÂ° º¯ ¼ö·Î Ç¥ÁØ È­¸éÀÎ stdscr À» »ç¿ëÇϸé Ç¥ÁØ È­¸é»óÀÇ ÇöÀç Ä¿¼­ À§Ä¡¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¼öÇà °á°ú´Â y ¿Í x º¯¼ö ¿¡ ÁÖ¾îÁø´Ù. getyx °¡ ½ÇÁ¦ C ÇÔ¼ö°¡ ¾Æ´Ï ¶ó ¸ÅÅ©·Î(macro)À̱⠶§¹®¿¡ °¡´ÉÇÑ °ÍÀÌ´Ù. 10.8. Űº¸µå ÀÔ·Â : getch curses ¿¡¼­ Űº¸µå·Î ºÎÅÍ ÇϳªÀÇ ¹®ÀÚ¸¦ ¹Þ¾Æ µéÀÏ °æ¿ì¿¡ getch ¸¦ »ç¿ëÇÑ ´Ù. getch ´Â C ¾ð¾îÀÇ getc ·çƾó·³ Á¤¼ö°ªÀ» µ¹·ÁÁØ´Ù. #include int in_ch; . . in_ch = getch(); ±â´ÉŰ ÀԷ óÀ½ ÇØ¾ßÇÏ´Â ÀÛ¾÷Àº curses keypad ·çƾÀ» ¼öÇà½ÃÄѼ­ ´Ü¸»±âÀÇ Å°ÆÐµå (keypad)¸¦ ÃʱâÈ­½ÃŰ´Â °ÍÀÌ´Ù. keypad(stdscr, TRUE); Ư¼öŰ´Â curses.h ¿¡ Á¤ÀÇµÈ °ªÀ» ÅëÇØ µ¹·ÁÁØ´Ù. ASCII °ª°úÀÇ Ãæµ¹À» ¸·±â À§ÇØ ÀÌ °ªµéÀº 8 Áø¼ö 401 ºÎÅÍ ½ÃÀ۵ȴÙ. int in_ch; . . in_ch = getch(); switch(in_ch){ case KEY_DOWN; /* down arrow key processing */ . . case KEY_UP; /* up arrow key processing */ . . } 10.9. È­¸é ÀÔ·Â : inch stdscr ÀÇ Æ¯Á¤ À§Ä¡¿¡ ¾î¶² ¹®ÀÚ°¡ ÀÖ´Â Áö ¾Ë¾Æ¾ß µÉ °æ¿ì°¡ ÀÖ´Ù. inch ´Â È­¸éÀÇ ÇöÀç Ä¿¼­ À§Ä¡¿¡ ÀÖ´Â ¹®ÀÚ¸¦ µ¹·ÁÁØ´Ù. ±×¸®°í mvinch ´Â ÁÖ¾îÁø À§ Ä¡ÀÇ ¹®ÀÚ¸¦ µ¹·ÁÁØ´Ù. #include int in_ch; . . in_ch = inch(); in_ch = mvinch(y, x); È­¸é»óÀÇ ±ÛÀÚ¿¡´Â ÇÏÀ̶óÀÌÆ® ŸÀÔ(highlight type) °°Àº ¼Ó¼º(attribute)À» Áö´Ñ °æ¿ì°¡ ÀÖ´Ù. À̶§ ½ÇÁ¦ ¹®ÀÚ¸¸À» ¾ò°í ½ÍÀ¸¸é curses.h ¿¡¼­ Á¤ÀÇµÈ »ó ¼ö A_CHARTEXT ¿Í ºñÆ®´ÜÀ§ AND ¸¦ ÇØ¾ßÇÑ´Ù. cvalue = ivalue & A_CHARTEXT; 10.10. È­¸é ÆíÁý ÀÌ¹Ì ±×·ÁÁø È­¸éÀ» º¯È­½ÃÄÑ¾ß ÇÏ´Â °æ¿ì°¡ Á¾Á¾ ÀÖ´Ù. curses ¿¡´Â ÀÌ·¯ÇÑ °æ¿ì¿¡ À¯¿ë ÇÑ ¿©·¯°¡Áö ·çƾµéÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ ·çƾµéÀ» 3°¡Áö·Î ±¸ºÐÇÒ ¼ö ÀÖ´Ù. È­¸éÀ» ¹éÁöÈ­(clear)½ÃŰ´Â °Í, ¹®ÀÚµéÀ» Áö¿ì°í È­¸éÀ» À籸¼ºÇÏ´Â °Í, È­¸éÀ» ÀüÇô Áö¿ì´Â °Í¾øÀÌ ¹®ÀÚ¸¦ ³¢¿ö ³Ö´Â °ÍµîÀÌ ÀÖ´Ù. stdscr »ó¿¡¼­ È­¸éÀÇ ÀϺκÐÀ» Áö¿ì´Â ·çƾ #include . . erase(); clear(); clrtobot(); clrtoeol(); erase ¿Í clear Àº µÑ´Ù Ç¥ÁØ À©µµ¿ì stdscrÀÇ ¸ðµç À§Ä¡¿¡ °ø¹é(space)À» ¾´´Ù. ´Ù¸¥Á¡Àº clear ´Â ¶ÇÇÑ ´ÙÀ½¹ø refresh °¡ È£ÃâµÉ ¶§ È­¸éÀ» ÀÚµ¿Àû À¸·Î ¹éÁöÈ­ ½ÃŲ´Ù´Â Á¡ÀÌ´Ù. clrtobot ´Â ÇöÀçÁÙÀÇ Ä¿¼­ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ¸ð µç ¹®ÀÚ¿Í Ä¿¼­ ¾Æ·¡¿¡ ÀÖ´Â ¸ðµç ÁÙÀ» Áö¿î´Ù. clrtoeol Àº ÇöÀçÁÙ¿¡¼­ Ä¿¼­ ÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ¸ðµç ¹®ÀÚ¸¦ Áö¿î´Ù. È­¸é»óÀÇ ¹®ÀÚµéÀ» Áö¿ï »Ó¸¸ ¾Æ´Ï¶ó ¹®ÀÚ¸¦ Áö¿ì¸é¼­ »ý±ä °ø¹éÀ» ¸Þ²Ù±â À§ ÇØ¼­ È­¸éÀ» À̵¿½ÃŰ´Â ·çƾ #include int y, x; . . delch(); mvdelch(y, x); deleteln(); delch ÀÇ °æ¿ì ÇöÀç Ä¿¼­ À§Ä¡¿¡ ÀÖ´Â ¹®ÀÚ°¡ Áö¿öÁø´Ù. ±×¸®°í ±× °ø¹éÀ» ¸Þ²Ù±â À§ÇØ Ä¿¼­ÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ¹®ÀÚµéÀ» ÇÑ Ä­¾¿ ¿ÞÂÊÀ¸·Î À̵¿½ÃŲ´Ù. mvdelch µµ ±â´ÉÀÌ °ÅÀÇ °°´Ù. ´Ù¸¸ ¸ÕÀú Ä¿¼­¸¦ ÁÖ¾îÁø À§Ä¡¿¡ À̵¿½ÃŲ ´Ù À½ delch ¿Í °°Àº ±â´ÉÀ» ¼öÇàÇÑ´Ù. deleteln Àº Ä¿¼­°¡ ÀÖ´Â ÁÙÀ» Áö¿î´Ù. ±× ¸®°í ³ª¼­ ±× ÁÙ ¹Ø¿¡ ÀÖ´ø ¸ðµç ÁÙÀ» ÇÑ Ä­¾¿ À§·Î À̵¿½ÃŲ´Ù. ¹®ÀÚ¸¦ ³¢¿ì´Â µ¥ °ü·ÃµÈ ·çƾ #include int c, y, x; . . insch(c); mvinsch(y, x, c); insertln(); insch ´Â ÇöÀç À§Ä¡¿¡ ¹®ÀÚ c ¸¦ ³¢¿î´Ù. ÇöÀç Ä¿¼­ À§Ä¡ÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ±ÛÀÚµéÀº ¸ðµÎ ÇÑ Ä­¾¿ ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÑ´Ù. ±× ÁÙÀÇ ¸¶Áö¸·¿¡ ÀÖ´Â ¹®ÀÚ´Â ÀÒ¾î¹ö¸®°Ô µÈ´Ù. mvinsch ´Â Ä¿¼­ÀÇ À§Ä¡¸¦ ¹Ù²Û ´ÙÀ½ insch ¿Í °°Àº ÀÛ¿ëÀ» ÇÑ´Ù. insertln Àº Ä¿¼­°¡ ÀÖ´Â ÁÙÀÇ À§¿¡ ºó ÁÙ(blank line)À» Çϳª Áý¾î³Ö´Â ´Ù. ±× ÁÙ ¹Ø¿¡ ÀÖ´Â ÁÙµéÀº ¸ðµÎ ÇÑ ÁÙ¾¿ ¹ØÀ¸·Î À̵¿ÇÑ´Ù. µû¶ó¼­ È­¸éÀÇ ¸Ç ¹Ø¿¡ ÀÖ´ø ÁÙÀº È­¸é»ó¿¡¼­ »ç¶óÁö°Ô µÈ´Ù. 10.11. ¿µ»ó ¼Ó¼º curses ¿¡¼­´Â ƯÁ¤ ¸ðµå·Î ±ÛÀÚ¸¦ È­¸é¿¡ ³ªÅ¸³»°í ½ÍÀ¸¸é ±× ¸ðµå¿¡ ÇØ´çÇÏ ´Â »ó¼ö¿Í ºñÆ®´ÜÀ§ OR ÇÏ¸é µÈ´Ù. addch(ch|A_BOLD); ´Â ch ¸¦ º¼µåü(bold;ÁÖÀ§ÀÇ ±Ûµéº¸´Ù ´õ ¹àÀº ¸ðµå) ·Î ³ªÅ¸³½´Ù. À̿ܿ¡µµ ¿©·¯°¡Áö ¸ðµå°¡ ÀÖ´Ù. A_STANDOUT ÀÌ ¸ðµå´Â ±ÛÀÚ¸¦ ÁýÁ߸ðµå·Î ³ªÅ¸³¾¶§ ¾²ÀδÙ. A_REVERSE ¿ªÀü ¸ðµå A_BOLD ±ÛÀÚµéÀÌ º¸¿ïµå·Î ³ªÅ¸³­´Ù. A_DIM ±ÛÀÚµéÀÌ ±âº»¸ðµåº¸´Ù ¾à°£ ¾îµÓ°Ô ³ªÅ¸³­´Ù. A_UNDERLINE ±ÛÀÚ ¹Ø¿¡ ¹ØÁÙÀÌ ±×¾îÁø ÇüÅ·Π³ªÅ¸³­´Ù. A_BLINK ±ÛÀÚµéÀÌ ¹Ý¦ÀδÙ. #include int atts; . . attrset(atts); attron(atts); attroff(atts); standout(); standend(); attrset Àº Ç¥ÁØ È­¸é»ó¿¡¼­ ¸ðµå¸¦ ÀÛµ¿½Ãų¶§ »ç¿ëÇÏ´Â ·çƾÀÌ´Ù. attron ·çƾÀº atts ¿¡ ÁÖ¾îÁø ¸ðµåµéÀ» ÀÛµ¿½ÃŲ´Ù. ÀÌ ·çƾÀº ¾Õ¿¡¼­ ÁöÁ¤µÈ ¸ðµå¸¦ ¹Ù²ÙÁö´Â ¾Ê´Â´Ù. ¸¶Âù°¡Áö·Î attroff ´Â ¼±ÅÃµÈ ¸ðµå¸¦ ÇØÁ¦ÇÑ´Ù. ±×¸®°í µÎ ·çƾ standout ¿Í standend ´Â °¢°¢ attron(A_STANDOUT) ¿Í attroff (A_STANDOUT) ¿Í µ¿ÀÏÇÑ ±â´ÉÀ» ÇÑ´Ù. 10.12. »õ À©µµ¿ì È­¸éÀÇ »ý¼º°ú Á¶ÀÛ »õ·Î¿î À©µµ¿ì¸¦ ´Ù·ç´Â ¹æ¹üÀ» ¼Ò°³ÇÑ´Ù. À©µµ¿ì¸¦ À§ÇÑ °¡Àå ±âº»ÀûÀÎ ·çƾ Àº newwin ÀÌ´Ù. #include WINDOW *win; int lines, cols, startline, startcol; . . win = newwin(lines, cols, startline, startcol); ÀÌ ·çƾÀ» ¼öÇà½ÃŰ¸é ¼¼·Î Å©±â°¡ lines, °¡·Î Å©±â°¡ cols ÀÎ À©µµ¿ì°¡ »ý ±ä´Ù. wmove(win, y, x); ÀÌ ·çƾÀ» ¼öÇàÇϸé À©µµ¿ì win »óÀÇ ÇöÀç Ä¿¼­ À§Ä¡°¡ ÁÂÇ¥(x,y)·Î ¹Ù²î°Ô µÈ´Ù. ÀÌ ÁÂÇ¥´Â Ç¥ÁØ À©µµ¿ì stdscr Ç¥°¡ ¾Æ´Ï¶ó À©µµ¿ì win ÀÇ ¸ÇÀ­ÁÙ ¸Ç ¿ÞÂÊÀ» ±âÁØÀ¸·Î ÇÑ ÁÂÇ¥ÀÌ´Ù. wrefresh(win); Àº À©µµ¿ì win ¿¡ ÀÖ´Â ³»¿ëµéÀÌ ½ÇÁ¦ È­¸é¿¡ ³ªÅ¸³­´Ù. 10.13. curses ¿¹ : domenu -- »ý·« 10.14. Çϵå¿þ¾î ÀÇÁ¸ ´Ü¸»±â Á¶Á¤ : terminfo terminfo ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ ´Ü¸»±âÀÇ Çϵå¿þ¾î¸¦ Á÷Á¢ Á¦¾îÇÏ ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. terminfo µ¥ÀÌŸº£À̽º¿¡´Â °¢ ´Ü¸»±âÀÇ Æ¯¼ºÀ» ¾òÀ» ¼ö ÀÖ´Ù. °¡Àå Å©°Ô ¹®Á¦°¡ ¹ß»ýÇÏ´Â °æ¿ì°¡ ÆÐµù(padding, ¼Óµµ´ÊÃã)À» ÇÒ¶§´Ù. À̴ܾî´Â ´Ü¸»±â°¡ ÇÁ·Î±×·¥ÀÇ ¼Óµµ¸¦ Àû´çÈ÷ À¯ÁöÇϵµ·Ï Ãâ·Â¼Óµµ¸¦ ´ÊÃß´Â °ÍÀ» ÀǹÌÇÑ´Ù. #include #include main() { setupterm(0, 1, 0); putp(clear_screen); reset_shell_mode(); exit(0); } È­¸éÀ» ¹éÁö½ÃŰ´Â ÇÁ·Î±×·¥ÀÌ´Ù. term.h¿¡´Â clear_screen À» Æ÷ÇÔÇÏ¿© ¿© ·¯°¡Áö ±â´ÉÀ» ³ªÅ¸³»´Â ¸ÅÅ©·ÎµéÀÌ Á¤ÀǵǾîÀÖ´Ù. setr-pterm Àº termino ÀÇ ÃʱâÈ­·çƾÀÌ´Ù. putp À» È£ÃâÇϸé È­¸éÀ» ¹éÁöÈ­½Ã۱â´Â ¹®ÀÚ¿­À» È­¸é¿¡ ³» º¸³½´Ù. putp ´Â Á»´õ ÀϹÝÀûÀÎ ±â´ÉÀ» °®´Â ·çƾ tputs ÀÇ Á¦ÇÑµÈ ¹öÀüÀÌ´Ù. reset_shell_mode ´Â ´Ü¸»±â¸¦ ¿ø·¡ÀÇ »óÅ·ΠµÇµ¹¸°´Ù. [Ãâó] [Æß] Unix / Linux System Programming °­Á #2|ÀÛ¼ºÀÚ Àè